GnuCash c935c2f+
Loading...
Searching...
No Matches
Files | Data Structures | Macros | Enumerations | Functions

A specialized register for Accounts Payable and Accounts Receivable. More...

Files

file  gncEntryLedger.h
 
file  gncEntryLedgerControl.h
 
file  gncEntryLedgerLayout.h
 
file  gncEntryLedgerModel.h
 
file  gncEntryLedgerP.h
 

Data Structures

struct  GncEntryLedger
 

Macros

#define ENTRY_IACCT_CELL   "inv-account"
 
#define ENTRY_BACCT_CELL   "bill-account"
 
#define ENTRY_ACTN_CELL   "action"
 
#define ENTRY_DATE_CELL   "date"
 
#define ENTRY_DESC_CELL   "description"
 
#define ENTRY_DISC_CELL   "discount"
 
#define ENTRY_DISTYPE_CELL   "discount-type"
 
#define ENTRY_DISHOW_CELL   "discount-how"
 
#define ENTRY_PRIC_CELL   "price"
 
#define ENTRY_QTY_CELL   "quantity"
 
#define ENTRY_TAXABLE_CELL   "istaxable"
 
#define ENTRY_TAXTABLE_CELL   "taxtable"
 
#define ENTRY_TAXINCLUDED_CELL   "taxincluded"
 
#define ENTRY_BILLABLE_CELL   "isbillable"
 
#define ENTRY_INV_CELL   "isinvoiced"
 
#define ENTRY_VALUE_CELL   "line-value"
 
#define ENTRY_TAXVAL_CELL   "line-tax-val"
 
#define ENTRY_PAYMENT_CELL   "payment"
 

Enumerations

enum  GncEntryLedgerType {
  GNC_ENTRY_ORDER_NONE = -1 , GNCENTRY_ORDER_ENTRY , GNCENTRY_ORDER_VIEWER , GNCENTRY_INVOICE_ENTRY ,
  GNCENTRY_INVOICE_VIEWER , GNCENTRY_CUST_CREDIT_NOTE_ENTRY , GNCENTRY_CUST_CREDIT_NOTE_VIEWER , GNCENTRY_BILL_ENTRY ,
  GNCENTRY_BILL_VIEWER , GNCENTRY_VEND_CREDIT_NOTE_ENTRY , GNCENTRY_VEND_CREDIT_NOTE_VIEWER , GNCENTRY_EXPVOUCHER_ENTRY ,
  GNCENTRY_EXPVOUCHER_VIEWER , GNCENTRY_EMPL_CREDIT_NOTE_ENTRY , GNCENTRY_EMPL_CREDIT_NOTE_VIEWER , GNCENTRY_NUM_REGISTER_TYPES
}
 

Functions

GncEntryLedger * gnc_entry_ledger_new (QofBook *book, GncEntryLedgerType type)
 Create and return a new GncEntry Ledger.
 
void gnc_entry_ledger_set_default_order (GncEntryLedger *ledger, GncOrder *order)
 Set the default order for this ledger.
 
void gnc_entry_ledger_set_default_invoice (GncEntryLedger *ledger, GncInvoice *invoice)
 Set the default invoice for this ledger.
 
void gnc_entry_ledger_destroy (GncEntryLedger *ledger)
 Destroy the GncEntry Ledger.
 
GncEntry * gnc_entry_ledger_get_current_entry (GncEntryLedger *ledger)
 Returns the Entry where the cursor is currently located.
 
void gnc_entry_ledger_load (GncEntryLedger *ledger, GList *entry_list)
 Copy GncEntry information from the list to the rows of the Ledger.
 
void gnc_entry_ledger_display_refresh (GncEntryLedger *ledger)
 
Table * gnc_entry_ledger_get_table (GncEntryLedger *ledger)
 Get the Table.
 
void gnc_entry_ledger_set_parent (GncEntryLedger *ledger, GtkWidget *parent)
 
void gnc_entry_ledger_set_readonly (GncEntryLedger *ledger, gboolean readonly)
 
gboolean gnc_entry_ledger_changed (GncEntryLedger *ledger)
 
void gnc_entry_ledger_cancel_cursor_changes (GncEntryLedger *ledger)
 
gboolean gnc_entry_ledger_commit_entry (GncEntryLedger *ledger)
 This will act just like hitting 'return' to record an entry.
 
gboolean gnc_entry_ledger_check_close (GtkWidget *parent, GncEntryLedger *ledger)
 This will ask the user if they really want to make a change.
 
void gnc_entry_ledger_reset_query (GncEntryLedger *ledger)
 
GncEntry * gnc_entry_ledger_get_entry (GncEntryLedger *ledger, VirtualCellLocation vcell_loc)
 Returns the GncEntry at the given location, or NULL if the location is not valid.
 
GncEntry * gnc_entry_ledger_get_blank_entry (GncEntryLedger *ledger)
 Returns the GncEntry that represents the blank new line at the bottom of the ledger.
 
gboolean gnc_entry_ledger_get_entry_virt_loc (GncEntryLedger *ledger, const GncEntry *entry, VirtualCellLocation *vcell_loc)
 Looks up the cell location of the given "entry" and writes the location into the variable pointed to by vcell_loc (which must be non-NULL).
 
void gnc_entry_ledger_delete_current_entry (GncEntryLedger *ledger)
 
void gnc_entry_ledger_duplicate_current_entry (GncEntryLedger *ledger)
 
void gnc_entry_ledger_move_current_entry_updown (GncEntryLedger *ledger, gboolean move_up)
 This implements the command of moving the current entry (where the cursor is currently located) one row upwards or downwards, effectively swapping this row and the other row.
 
QofQuerygnc_entry_ledger_get_query (GncEntryLedger *ledger)
 
void gnc_entry_ledger_set_prefs_group (GncEntryLedger *ledger, const gchar *string)
 
TableControlgnc_entry_ledger_control_new (void)
 
TableLayout * gnc_entry_ledger_layout_new (GncEntryLedger *ledger)
 
TableModelgnc_entry_ledger_model_new (GncEntryLedgerType type)
 Public Interface.
 
Accountgnc_entry_ledger_get_account_by_name (GncEntryLedger *ledger, BasicCell *bcell, const char *name, gboolean *isnew)
 
Accountgnc_entry_ledger_get_account (GncEntryLedger *ledger, const char *cell_name)
 
GncTaxTablegnc_entry_ledger_get_taxtable (GncEntryLedger *ledger, const char *cell_name)
 
gint gnc_entry_ledger_get_type (GncEntryLedger *ledger, const char *cell_name)
 
gboolean gnc_entry_ledger_get_checkmark (GncEntryLedger *ledger, const char *cell_name)
 
gboolean gnc_entry_ledger_get_numeric (GncEntryLedger *ledger, const char *cell_name, gnc_numeric *value)
 
const char * gnc_entry_ledger_type_string_getter (char flag)
 
const char * gnc_entry_ledger_how_string_getter (char flag)
 
gboolean gnc_entry_ledger_find_entry (GncEntryLedger *ledger, GncEntry *entry, VirtualCellLocation *vcell_loc)
 
void gnc_entry_ledger_load_xfer_cells (GncEntryLedger *ledger)
 
void gnc_entry_ledger_display_init (GncEntryLedger *ledger)
 
void gnc_entry_ledger_display_fini (GncEntryLedger *ledger)
 
void gnc_entry_ledger_compute_value (GncEntryLedger *ledger, gnc_numeric *value, gnc_numeric *tax_value)
 

Detailed Description

A specialized register for Accounts Payable and Accounts Receivable.

Macro Definition Documentation

◆ ENTRY_ACTN_CELL

#define ENTRY_ACTN_CELL   "action"

Definition at line 60 of file gncEntryLedger.h.

◆ ENTRY_BACCT_CELL

#define ENTRY_BACCT_CELL   "bill-account"

Definition at line 59 of file gncEntryLedger.h.

◆ ENTRY_BILLABLE_CELL

#define ENTRY_BILLABLE_CELL   "isbillable"

Definition at line 71 of file gncEntryLedger.h.

◆ ENTRY_DATE_CELL

#define ENTRY_DATE_CELL   "date"

Definition at line 61 of file gncEntryLedger.h.

◆ ENTRY_DESC_CELL

#define ENTRY_DESC_CELL   "description"

Definition at line 62 of file gncEntryLedger.h.

◆ ENTRY_DISC_CELL

#define ENTRY_DISC_CELL   "discount"

Definition at line 63 of file gncEntryLedger.h.

◆ ENTRY_DISHOW_CELL

#define ENTRY_DISHOW_CELL   "discount-how"

Definition at line 65 of file gncEntryLedger.h.

◆ ENTRY_DISTYPE_CELL

#define ENTRY_DISTYPE_CELL   "discount-type"

Definition at line 64 of file gncEntryLedger.h.

◆ ENTRY_IACCT_CELL

#define ENTRY_IACCT_CELL   "inv-account"

Definition at line 58 of file gncEntryLedger.h.

◆ ENTRY_INV_CELL

#define ENTRY_INV_CELL   "isinvoiced"

Definition at line 73 of file gncEntryLedger.h.

◆ ENTRY_PAYMENT_CELL

#define ENTRY_PAYMENT_CELL   "payment"

Definition at line 77 of file gncEntryLedger.h.

◆ ENTRY_PRIC_CELL

#define ENTRY_PRIC_CELL   "price"

Definition at line 66 of file gncEntryLedger.h.

◆ ENTRY_QTY_CELL

#define ENTRY_QTY_CELL   "quantity"

Definition at line 67 of file gncEntryLedger.h.

◆ ENTRY_TAXABLE_CELL

#define ENTRY_TAXABLE_CELL   "istaxable"

Definition at line 68 of file gncEntryLedger.h.

◆ ENTRY_TAXINCLUDED_CELL

#define ENTRY_TAXINCLUDED_CELL   "taxincluded"

Definition at line 70 of file gncEntryLedger.h.

◆ ENTRY_TAXTABLE_CELL

#define ENTRY_TAXTABLE_CELL   "taxtable"

Definition at line 69 of file gncEntryLedger.h.

◆ ENTRY_TAXVAL_CELL

#define ENTRY_TAXVAL_CELL   "line-tax-val"

Definition at line 75 of file gncEntryLedger.h.

◆ ENTRY_VALUE_CELL

#define ENTRY_VALUE_CELL   "line-value"

Definition at line 74 of file gncEntryLedger.h.

Enumeration Type Documentation

◆ GncEntryLedgerType

enum GncEntryLedgerType

Definition at line 38 of file gncEntryLedger.h.

39{
40 GNC_ENTRY_ORDER_NONE = -1, //Force clang to use int representation of enum.
41 GNCENTRY_ORDER_ENTRY,
42 GNCENTRY_ORDER_VIEWER,
43 GNCENTRY_INVOICE_ENTRY,
44 GNCENTRY_INVOICE_VIEWER,
45 GNCENTRY_CUST_CREDIT_NOTE_ENTRY,
46 GNCENTRY_CUST_CREDIT_NOTE_VIEWER,
47 GNCENTRY_BILL_ENTRY,
48 GNCENTRY_BILL_VIEWER,
49 GNCENTRY_VEND_CREDIT_NOTE_ENTRY,
50 GNCENTRY_VEND_CREDIT_NOTE_VIEWER,
51 GNCENTRY_EXPVOUCHER_ENTRY,
52 GNCENTRY_EXPVOUCHER_VIEWER,
53 GNCENTRY_EMPL_CREDIT_NOTE_ENTRY,
54 GNCENTRY_EMPL_CREDIT_NOTE_VIEWER,
55 GNCENTRY_NUM_REGISTER_TYPES
56} GncEntryLedgerType;

Function Documentation

◆ gnc_entry_ledger_cancel_cursor_changes()

void gnc_entry_ledger_cancel_cursor_changes ( GncEntryLedger *  ledger)

Definition at line 956 of file gncEntryLedgerControl.c.

957{
958 VirtualLocation virt_loc;
959
960 if (ledger == NULL)
961 return;
962
963 virt_loc = ledger->table->current_cursor_loc;
964
965 if (!gnc_table_current_cursor_changed (ledger->table, FALSE))
966 return;
967
968 /* When cancelling edits, reload the cursor from the entry. */
969 gnc_table_clear_current_cursor_changes (ledger->table);
970
971 if (gnc_table_find_close_valid_cell (ledger->table, &virt_loc, FALSE))
972 gnc_table_move_cursor_gui (ledger->table, virt_loc);
973
974 gnc_table_refresh_gui (ledger->table, TRUE);
975}
void gnc_table_refresh_gui(Table *table, gboolean do_scroll)
Refresh the whole GUI from the table.
void gnc_table_move_cursor_gui(Table *table, VirtualLocation new_virt_loc)
will move the cursor and its GUI to the indicated location.
gboolean gnc_table_find_close_valid_cell(Table *table, VirtualLocation *virt_loc, gboolean exact_pointer)
Find a close valid cell.

◆ gnc_entry_ledger_changed()

gboolean gnc_entry_ledger_changed ( GncEntryLedger *  ledger)

Definition at line 694 of file gncEntryLedger.c.

695{
696 if (!ledger)
697 return FALSE;
698
699 if (gnc_table_current_cursor_changed (ledger->table, FALSE))
700 return TRUE;
701
702 return FALSE;
703}

◆ gnc_entry_ledger_check_close()

gboolean gnc_entry_ledger_check_close ( GtkWidget *  parent,
GncEntryLedger *  ledger 
)

This will ask the user if they really want to make a change.

Definition at line 1012 of file gncEntryLedgerControl.c.

1013{
1014 if (!ledger) return TRUE;
1015
1016 if (gnc_entry_ledger_changed (ledger))
1017 {
1018 gboolean dontask = FALSE;
1019
1020 if (ledger->type == GNCENTRY_INVOICE_ENTRY ||
1021 ledger->type == GNCENTRY_CUST_CREDIT_NOTE_ENTRY)
1022 {
1023 gboolean inv_value;
1024 gboolean only_inv_changed = FALSE;
1025
1026 if (gnc_table_current_cursor_changed (ledger->table, FALSE) == 1 &&
1027 gnc_table_layout_get_cell_changed (ledger->table->layout,
1028 ENTRY_INV_CELL, TRUE))
1029 only_inv_changed = TRUE;
1030
1031 inv_value = gnc_entry_ledger_get_checkmark (ledger, ENTRY_INV_CELL);
1032
1033 if (inv_value && only_inv_changed)
1034 {
1035 /* If the only change is that the 'inv' entry was clicked
1036 * "on", then just accept the change it without question.
1037 */
1038 dontask = TRUE;
1039 }
1040 }
1041
1042 return gnc_entry_ledger_check_close_internal (parent, ledger, dontask);
1043
1044 }
1045 return TRUE;
1046}

◆ gnc_entry_ledger_commit_entry()

gboolean gnc_entry_ledger_commit_entry ( GncEntryLedger *  ledger)

This will act just like hitting 'return' to record an entry.

Definition at line 1004 of file gncEntryLedgerControl.c.

1005{
1006 if (!ledger) return TRUE;
1007
1008 return gnc_entry_ledger_check_close_internal (NULL, ledger, TRUE);
1009}

◆ gnc_entry_ledger_compute_value()

void gnc_entry_ledger_compute_value ( GncEntryLedger *  ledger,
gnc_numeric *  value,
gnc_numeric *  tax_value 
)

Definition at line 706 of file gncEntryLedger.c.

708{
709 gnc_numeric qty = gnc_numeric_zero(), price = gnc_numeric_zero(), discount = gnc_numeric_zero();
710 gint disc_type, disc_how;
711 gboolean taxable, taxincluded;
713 GList *taxes = NULL;
714 int denom = 100;
715 gnc_numeric value_unrounded, taxes_unrounded;
716 GncEntry *entry;
717
718 gnc_entry_ledger_get_numeric (ledger, ENTRY_QTY_CELL, &qty);
719 entry = gnc_entry_ledger_get_current_entry (ledger);
720 if (ledger->is_cust_doc)
721 price = gncEntryGetInvPrice (entry);
722 else
723 price = gncEntryGetBillPrice (entry);
724 gnc_entry_ledger_get_numeric (ledger, ENTRY_DISC_CELL, &discount);
725
726 disc_type = gnc_entry_ledger_get_type (ledger, ENTRY_DISTYPE_CELL);
727 disc_how = gnc_entry_ledger_get_type (ledger, ENTRY_DISHOW_CELL);
728
729 /* Some ledger types (see full list in gnc_entry_ledger_set_cells)
730 don't have discounts */
731 if (ledger->type == GNCENTRY_BILL_ENTRY ||
732 ledger->type == GNCENTRY_BILL_VIEWER ||
733 ledger->type == GNCENTRY_VEND_CREDIT_NOTE_ENTRY ||
734 ledger->type == GNCENTRY_VEND_CREDIT_NOTE_VIEWER ||
735 ledger->type == GNCENTRY_EXPVOUCHER_ENTRY ||
736 ledger->type == GNCENTRY_EXPVOUCHER_VIEWER ||
737 ledger->type == GNCENTRY_EMPL_CREDIT_NOTE_ENTRY ||
738 ledger->type == GNCENTRY_EMPL_CREDIT_NOTE_VIEWER)
739 {
740 g_assert (gnc_numeric_zero_p (discount));
741 disc_type = GNC_AMT_TYPE_VALUE;
742 disc_how = GNC_DISC_PRETAX;
743 }
744
745
746 /* If we're so early in the process that we don't have info, stop now */
747 if (disc_type < 0 || disc_how < 0)
748 {
749 if (value)
750 *value = gnc_numeric_zero ();
751 if (tax_value)
752 *tax_value = gnc_numeric_zero ();
753 return;
754 }
755
756 taxable = gnc_entry_ledger_get_checkmark (ledger, ENTRY_TAXABLE_CELL);
757 taxincluded = gnc_entry_ledger_get_checkmark (ledger, ENTRY_TAXINCLUDED_CELL);
758 table = gnc_entry_ledger_get_taxtable (ledger, ENTRY_TAXTABLE_CELL);
759
760 /* Expense vouchers don't have taxable, taxincluded, or taxtable cells, either */
761 if (ledger->type == GNCENTRY_EXPVOUCHER_ENTRY ||
762 ledger->type == GNCENTRY_EXPVOUCHER_VIEWER)
763 {
764 taxable = FALSE;
765 taxincluded = FALSE;
766 table = NULL;
767 }
768
769 if (ledger->invoice)
770 {
771 gnc_commodity *currency = gncInvoiceGetCurrency(ledger->invoice);
772 if (currency)
773 denom = gnc_commodity_get_fraction(currency);
774 }
775
776 gncEntryComputeValue (qty, price, (taxable ? table : NULL), taxincluded,
777 discount, disc_type, disc_how, 0,
778 &value_unrounded, NULL, &taxes);
779
780 if (value)
781 *value = gnc_numeric_convert (value_unrounded, denom,
782 GNC_HOW_RND_ROUND_HALF_UP);
783
784 /* return the tax value */
785 taxes_unrounded = gncAccountValueTotal (taxes);
787 if (tax_value)
788 *tax_value = gnc_numeric_convert (taxes_unrounded, denom,
789 GNC_HOW_RND_ROUND_HALF_UP);
790}
GncEntry * gnc_entry_ledger_get_current_entry(GncEntryLedger *ledger)
Returns the Entry where the cursor is currently located.
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
void gncAccountValueDestroy(GList *list)
Destroy a list of accountvalues.
gnc_numeric gncAccountValueTotal(GList *list)
return the total for this list
@ GNC_AMT_TYPE_VALUE
tax is a number
Definition gncTaxTable.h:80
modtime is the internal date of the last modtime See libgnucash/engine/TaxTableBillTermImmutability....

◆ gnc_entry_ledger_control_new()

TableControl * gnc_entry_ledger_control_new ( void  )

Definition at line 944 of file gncEntryLedgerControl.c.

945{
946 TableControl * control;
947
948 control = gnc_table_control_new ();
949 control->move_cursor = gnc_entry_ledger_move_cursor;
950 control->traverse = gnc_entry_ledger_traverse;
951
952 return control;
953}

◆ gnc_entry_ledger_delete_current_entry()

void gnc_entry_ledger_delete_current_entry ( GncEntryLedger *  ledger)

Definition at line 837 of file gncEntryLedger.c.

838{
839 GncEntry *entry;
840
841 if (!ledger)
842 return;
843
844 /* If there is no entry, just return */
845 entry = gnc_entry_ledger_get_current_entry (ledger);
846 if (!entry)
847 return;
848
849 /* If this is the blank entry, just cancel the changes */
850 if (entry == gnc_entry_ledger_get_blank_entry (ledger))
851 {
852 gnc_entry_ledger_cancel_cursor_changes (ledger);
853 return;
854 }
855
856 /* Ok, let's delete this entry */
857 gnc_suspend_gui_refresh ();
858 if (!gncEntryIsOpen (entry))
859 gncEntryBeginEdit (entry);
860
861 {
862 GncOrder *order;
863 GncInvoice *invoice;
864
865 order = gncEntryGetOrder (entry);
866 if (order)
867 gncOrderRemoveEntry (order, entry);
868
869 invoice = gncEntryGetInvoice (entry);
870 if (invoice)
871 gncInvoiceRemoveEntry (invoice, entry);
872
873 invoice = gncEntryGetBill (entry);
874 if (invoice)
875 gncBillRemoveEntry (invoice, entry);
876
877 gncEntryDestroy (entry);
878 }
879 gnc_resume_gui_refresh ();
880}
GncEntry * gnc_entry_ledger_get_blank_entry(GncEntryLedger *ledger)
Exported Functions.

◆ gnc_entry_ledger_destroy()

void gnc_entry_ledger_destroy ( GncEntryLedger *  ledger)

Destroy the GncEntry Ledger.

Definition at line 387 of file gncEntryLedger.c.

388{
389 if (!ledger) return;
390
391 /* Destroy blank entry, etc. */
392 gnc_entry_ledger_clear_blank_entry (ledger);
393 gnc_entry_ledger_display_fini (ledger);
394 gnc_table_destroy (ledger->table);
395 qof_query_destroy (ledger->query);
396 g_free (ledger);
397}
void qof_query_destroy(QofQuery *query)
Frees the resources associate with a Query object.

◆ gnc_entry_ledger_display_fini()

void gnc_entry_ledger_display_fini ( GncEntryLedger *  ledger)

Definition at line 192 of file gncEntryLedgerDisplay.c.

193{
194 if (!ledger) return;
195
196 gnc_unregister_gui_component (ledger->component_id);
197 gnc_prefs_remove_cb_by_func (GNC_PREFS_GROUP_GENERAL, GNC_PREF_ACCOUNT_SEPARATOR,
198 gnc_entry_ledger_pref_changed, ledger);
199}
void gnc_prefs_remove_cb_by_func(const gchar *group, const gchar *pref_name, gpointer func, gpointer user_data)
Remove a function that was registered for a callback when the given preference changed.

◆ gnc_entry_ledger_display_init()

void gnc_entry_ledger_display_init ( GncEntryLedger *  ledger)

Definition at line 177 of file gncEntryLedgerDisplay.c.

178{
179 if (!ledger) return;
180
181 ledger->full_refresh = TRUE;
182 ledger->component_id = gnc_register_gui_component (ENTRYLEDGER_CLASS,
183 refresh_handler,
184 NULL, ledger);
185 gnc_prefs_register_cb (GNC_PREFS_GROUP_GENERAL, GNC_PREF_ACCOUNT_SEPARATOR,
186 gnc_entry_ledger_pref_changed, ledger);
187
188 gnc_entry_ledger_display_refresh (ledger);
189}
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
Register a callback that gets triggered when the given preference changes.

◆ gnc_entry_ledger_display_refresh()

void gnc_entry_ledger_display_refresh ( GncEntryLedger *  ledger)

Definition at line 202 of file gncEntryLedgerDisplay.c.

203{
204 GList *entries;
205
206 if (!ledger || ledger->loading) return;
207
208 entries = gnc_entry_ledger_get_entries (ledger);
209
210 gnc_entry_ledger_set_watches (ledger, entries);
211
212 gnc_entry_ledger_refresh_internal (ledger, entries);
213}

◆ gnc_entry_ledger_duplicate_current_entry()

void gnc_entry_ledger_duplicate_current_entry ( GncEntryLedger *  ledger)

Definition at line 883 of file gncEntryLedger.c.

884{
885 GncEntry *entry;
886 gboolean changed;
887
888 if (!ledger)
889 return;
890
891 /* Be paranoid */
892 entry = gnc_entry_ledger_get_current_entry (ledger);
893 if (!entry)
894 return;
895
896 changed = gnc_table_current_cursor_changed (ledger->table, FALSE);
897
898 /* See if we're asked to duplicate an unchanged blank entry --
899 * there is no point in doing that.
900 */
901 if (!changed && entry == gnc_entry_ledger_get_blank_entry (ledger))
902 return;
903
904 gnc_suspend_gui_refresh ();
905
906 /* If the cursor has been edited, we are going to have to commit
907 * it before we can duplicate. Make sure the user wants to do that. */
908 if (changed)
909 {
910 const char *title = _("Save the current entry?");
911 const char *message =
912 _("The current transaction has been changed. Would you like to "
913 "record the changes before duplicating this entry, or "
914 "cancel the duplication?");
915 GtkWidget *dialog;
916 gint response;
917
918 dialog = gtk_message_dialog_new(GTK_WINDOW(ledger->parent),
919 GTK_DIALOG_DESTROY_WITH_PARENT,
920 GTK_MESSAGE_QUESTION,
921 GTK_BUTTONS_NONE,
922 "%s", title);
923 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
924 "%s", message);
925 gtk_dialog_add_buttons(GTK_DIALOG(dialog),
926 _("_Cancel"), GTK_RESPONSE_CANCEL,
927 _("_Record"), GTK_RESPONSE_ACCEPT,
928 NULL);
929 response = gnc_dialog_run(GTK_DIALOG(dialog), GNC_PREF_WARN_INV_ENTRY_DUP);
930 gtk_widget_destroy(dialog);
931
932 if (response != GTK_RESPONSE_ACCEPT)
933 {
934 gnc_resume_gui_refresh ();
935 return;
936 }
937
938 if (!gnc_entry_ledger_commit_entry (ledger))
939 {
940 gnc_resume_gui_refresh ();
941 return;
942 }
943 }
944
945 /* Ok, we're ready to make the copy */
946 {
947 GncEntry * new_entry;
948
949 new_entry = gncEntryCreate (ledger->book);
950 gncEntryCopy (entry, new_entry, TRUE);
951 gncEntrySetDateGDate (new_entry, &ledger->last_date_entered);
952
953 /* We also must set a new DateEntered on the new entry
954 * because otherwise the ordering is not deterministic */
955 gncEntrySetDateEntered (new_entry, gnc_time (NULL));
956
957 /* Set the hint for where to display on the refresh */
958 ledger->hint_entry = new_entry;
959 }
960
961 gnc_resume_gui_refresh ();
962 return;
963}
gboolean gnc_entry_ledger_commit_entry(GncEntryLedger *ledger)
This will act just like hitting 'return' to record an entry.
time64 gnc_time(time64 *tbuf)
get the current time
Definition gnc-date.cpp:262
void gncEntrySetDateGDate(GncEntry *entry, const GDate *date)
Set the date of this entry.
Definition gncEntry.c:504

◆ gnc_entry_ledger_find_entry()

gboolean gnc_entry_ledger_find_entry ( GncEntryLedger *  ledger,
GncEntry *  entry,
VirtualCellLocation *  vcell_loc 
)

Definition at line 582 of file gncEntryLedger.c.

584{
585 Table *table = ledger->table;
586 int v_row;
587 GncEntry *e;
588
589 for (v_row = 1; v_row < table->num_virt_rows; v_row++)
590 {
591 VirtualCellLocation vc_loc = { v_row, 0 };
592
593 e = gnc_entry_ledger_get_entry (ledger, vc_loc);
594
595 if (e == entry)
596 {
597 if (vcell_loc != NULL)
598 *vcell_loc = vc_loc;
599 return TRUE;
600 }
601 }
602 return FALSE;
603}
GncEntry * gnc_entry_ledger_get_entry(GncEntryLedger *ledger, VirtualCellLocation vcell_loc)
Returns the GncEntry at the given location, or NULL if the location is not valid.

◆ gnc_entry_ledger_get_account()

Account * gnc_entry_ledger_get_account ( GncEntryLedger *  ledger,
const char *  cell_name 
)

Definition at line 143 of file gncEntryLedger.c.

145{
146 BasicCell *cell;
147 const char * name;
148 gboolean dummy;
149
150 cell = gnc_table_layout_get_cell (ledger->table->layout, cell_name);
151 if (!cell)
152 return NULL;
153 name = gnc_basic_cell_get_value (cell);
154 return gnc_entry_ledger_get_account_by_name (ledger, cell, name, &dummy);
155}

◆ gnc_entry_ledger_get_account_by_name()

Account * gnc_entry_ledger_get_account_by_name ( GncEntryLedger *  ledger,
BasicCell *  bcell,
const char *  name,
gboolean *  isnew 
)

Definition at line 82 of file gncEntryLedger.c.

84{
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?");
88 char *account_name;
89 ComboCell *cell = (ComboCell *) bcell;
90 Account *account;
91 GList *account_types = NULL;
92
93 /* Find the account */
94 account = gnc_account_lookup_for_register (gnc_get_current_root_account (), name);
95 if (!account)
96 account = gnc_account_lookup_by_code (gnc_get_current_root_account(), name);
97
98 if (!account)
99 {
100 /* Ask if they want to create a new one. */
101 if (!gnc_verify_dialog (GTK_WINDOW (ledger->parent), TRUE, missing, name))
102 return NULL;
103
104 /* No changes, as yet. */
105 *isnew = FALSE;
106
107 /* User said yes, they want to create a new account. */
108 account_types = g_list_prepend (account_types, (gpointer)ACCT_TYPE_CREDIT);
109 account_types = g_list_prepend (account_types, (gpointer)ACCT_TYPE_ASSET);
110 account_types = g_list_prepend (account_types, (gpointer)ACCT_TYPE_LIABILITY);
111 if ( ledger->is_cust_doc )
112 account_types = g_list_prepend (account_types, (gpointer)ACCT_TYPE_INCOME);
113 else
114 account_types = g_list_prepend (account_types, (gpointer)ACCT_TYPE_EXPENSE);
115
116 account = gnc_ui_new_accounts_from_name_with_defaults (GTK_WINDOW (ledger->parent), name, account_types,
117 NULL, NULL);
118 g_list_free ( account_types );
119 if (!account)
120 return NULL;
121 *isnew = TRUE;
122 }
123
124 /* Now have a new account. Update the cell with the name as created. */
125 account_name = gnc_get_account_name_for_register (account);
126 if (g_strcmp0(account_name, gnc_basic_cell_get_value(bcell)))
127 {
128 gnc_combo_cell_set_value (cell, account_name);
129 gnc_basic_cell_set_changed (&cell->cell, TRUE);
130 }
131 g_free (account_name);
132
133 /* See if the account (either old or new) is a placeholder. */
134 if (xaccAccountGetPlaceholder (account))
135 {
136 gnc_error_dialog (GTK_WINDOW (ledger->parent), placeholder, name);
137 }
138
139 /* Be seeing you. */
140 return account;
141}
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an account.
Definition Account.cpp:4119
Account * gnc_account_lookup_by_code(const Account *parent, const char *code)
The gnc_account_lookup_by_code() subroutine works like gnc_account_lookup_by_name,...
Definition Account.cpp:3106
Account * gnc_ui_new_accounts_from_name_with_defaults(GtkWindow *parent, const char *name, GList *valid_types, const gnc_commodity *default_commodity, Account *parent_acct)
Display a modal window for creating a new account.
char * gnc_get_account_name_for_register(const Account *account)
Get either the full name of the account or the simple name, depending on the configuration parameter ...
Account * gnc_account_lookup_for_register(const Account *base_account, const char *name)
Retrieve the account matching the given name starting from the descendants of base_account.
STRUCTS.
The ComboCell object implements a cell handler with a "combination-box" pull-down menu in it.
Definition combocell.h:53

◆ gnc_entry_ledger_get_blank_entry()

GncEntry * gnc_entry_ledger_get_blank_entry ( GncEntryLedger *  ledger)

Returns the GncEntry that represents the blank new line at the bottom of the ledger.

Returns the GncEntry that represents the blank new line at the bottom of the ledger.

Definition at line 75 of file gncEntryLedger.c.

76{
77 if (!ledger) return NULL;
78 return gncEntryLookup (ledger->book, &(ledger->blank_entry_guid));
79}

◆ gnc_entry_ledger_get_checkmark()

gboolean gnc_entry_ledger_get_checkmark ( GncEntryLedger *  ledger,
const char *  cell_name 
)

Definition at line 179 of file gncEntryLedger.c.

181{
182 CheckboxCell *cell =
183 (CheckboxCell *) gnc_table_layout_get_cell (ledger->table->layout, cell_name);
184
185 if (!cell)
186 return FALSE;
187
188 return cell->flag;
189}
The CheckboxCell object implements a cell handler that will toggle between yes and no values when cli...

◆ gnc_entry_ledger_get_current_entry()

GncEntry * gnc_entry_ledger_get_current_entry ( GncEntryLedger *  ledger)

Returns the Entry where the cursor is currently located.

Definition at line 232 of file gncEntryLedger.c.

233{
234 if (!ledger) return NULL;
235
236 return
238 ledger->table->current_cursor_loc.vcell_loc);
239}

◆ gnc_entry_ledger_get_entry()

GncEntry * gnc_entry_ledger_get_entry ( GncEntryLedger *  ledger,
VirtualCellLocation  vcell_loc 
)

Returns the GncEntry at the given location, or NULL if the location is not valid.

Definition at line 218 of file gncEntryLedger.c.

220{
221 GncGUID *guid;
222
223 if (!ledger) return NULL;
224
225 guid = gnc_table_get_vcell_data (ledger->table, vcell_loc);
226 if (!guid) return NULL;
227
228 return gncEntryLookup (ledger->book, guid);
229}
gpointer gnc_table_get_vcell_data(Table *table, VirtualCellLocation vcell_loc)
returns the virtual cell data associated with a cursor located at the given virtual coords,...
The type used to store guids in C.
Definition guid.h:75

◆ gnc_entry_ledger_get_entry_virt_loc()

gboolean gnc_entry_ledger_get_entry_virt_loc ( GncEntryLedger *  ledger,
const GncEntry *  entry,
VirtualCellLocation *  vcell_loc 
)

Looks up the cell location of the given "entry" and writes the location into the variable pointed to by vcell_loc (which must be non-NULL).

Returns TRUE if the entry was found, otherwise FALSE.

Definition at line 793 of file gncEntryLedger.c.

795{
796 Table *table;
797 int v_row;
798 int v_col;
799
800 if ((ledger == NULL) || (entry == NULL))
801 return FALSE;
802 g_assert(vcell_loc);
803
804 table = ledger->table;
805
806 /* go backwards because typically you search for entries at the end */
807
808 for (v_row = table->num_virt_rows - 1; v_row > 0; v_row--)
809 for (v_col = 0; v_col < table->num_virt_cols; v_col++)
810 {
811 VirtualCellLocation vc_loc = { v_row, v_col };
812 VirtualCell *vcell;
813 GncEntry *e;
814
815 vcell = gnc_table_get_virtual_cell (table, vc_loc);
816 if (vcell == NULL)
817 continue;
818
819 if (!vcell->visible)
820 continue;
821
822 e = gncEntryLookup (ledger->book, vcell->vcell_data);
823
824 if (e == entry)
825 {
826 if (vcell_loc)
827 *vcell_loc = vc_loc;
828
829 return TRUE;
830 }
831 }
832
833 return FALSE;
834}
VirtualCell * gnc_table_get_virtual_cell(Table *table, VirtualCellLocation vcell_loc)
returns the virtual cell associated with a particular virtual location.
holds information about each virtual cell.
gpointer vcell_data
Array of physical cells.
unsigned int visible
Used by higher-level code.

◆ gnc_entry_ledger_get_numeric()

gboolean gnc_entry_ledger_get_numeric ( GncEntryLedger *  ledger,
const char *  cell_name,
gnc_numeric *  value 
)

Definition at line 203 of file gncEntryLedger.c.

206{
207 PriceCell *cell =
208 (PriceCell *) gnc_table_layout_get_cell (ledger->table->layout, cell_name);
209
210 if (!value || !cell)
211 return FALSE;
212
213 *value = gnc_price_cell_get_value (cell);
214 return TRUE;
215}
gnc_numeric gnc_price_cell_get_value(PriceCell *cell)
return the value of a price cell
Definition pricecell.c:208
The PriceCell object implements a cell handler that stores a single double-precision value,...
Definition pricecell.h:55

◆ gnc_entry_ledger_get_query()

QofQuery * gnc_entry_ledger_get_query ( GncEntryLedger *  ledger)

Definition at line 966 of file gncEntryLedger.c.

967{
968 if (!ledger)
969 return NULL;
970
971 return ledger->query;
972}

◆ gnc_entry_ledger_get_table()

Table * gnc_entry_ledger_get_table ( GncEntryLedger *  ledger)

Get the Table.

Definition at line 399 of file gncEntryLedger.c.

400{
401 if (!ledger) return NULL;
402 return ledger->table;
403}

◆ gnc_entry_ledger_get_taxtable()

GncTaxTable * gnc_entry_ledger_get_taxtable ( GncEntryLedger *  ledger,
const char *  cell_name 
)

Definition at line 157 of file gncEntryLedger.c.

159{
160 GncEntry *entry;
161 const char * name;
162
163 /* If the cursor has changed, then pull in the current table */
164 if (gnc_table_layout_get_cell_changed (ledger->table->layout,
165 cell_name, TRUE))
166 {
167 name = gnc_table_layout_get_cell_value (ledger->table->layout, cell_name);
168 return gncTaxTableLookupByName (ledger->book, name);
169 }
170
171 /* If it has not changed, pull in the table from the entry */
172 entry = gnc_entry_ledger_get_current_entry (ledger);
173 if (ledger->is_cust_doc)
174 return gncEntryGetInvTaxTable (entry);
175 else
176 return gncEntryGetBillTaxTable (entry);
177}

◆ gnc_entry_ledger_get_type()

gint gnc_entry_ledger_get_type ( GncEntryLedger *  ledger,
const char *  cell_name 
)

Definition at line 191 of file gncEntryLedger.c.

192{
193 RecnCell *cell =
194 (RecnCell *) gnc_table_layout_get_cell (ledger->table->layout, cell_name);
195
196 if (!cell)
197 return -1;
198
199 return (gnc_recn_cell_get_flag (cell) - '0');
200}
The RecnCell object implements a cell handler that will cycle through a series of single-character va...
Definition recncell.h:48

◆ gnc_entry_ledger_how_string_getter()

const char * gnc_entry_ledger_how_string_getter ( char  flag)

Definition at line 62 of file gncEntryLedgerLoad.c.

63{
64 switch (flag)
65 {
66 case '1':
67 return _ ("<");
68 case '2':
69 return _ ("=");
70 case '3':
71 return _ (">");
72 default:
73 break;
74 };
75 return "?";
76}

◆ gnc_entry_ledger_layout_new()

TableLayout * gnc_entry_ledger_layout_new ( GncEntryLedger *  ledger)

Definition at line 290 of file gncEntryLedgerLayout.c.

291{
292 TableLayout *layout;
293
294 layout = gnc_table_layout_new ();
295 gnc_entry_ledger_layout_add_cells (ledger, layout);
296 gnc_entry_ledger_layout_add_cursors (ledger, layout);
297 gnc_entry_ledger_set_cells (ledger, layout);
298
299 return layout;
300}
TableLayout * gnc_table_layout_new(void)
API Declarations.

◆ gnc_entry_ledger_load()

void gnc_entry_ledger_load ( GncEntryLedger *  ledger,
GList *  entry_list 
)

Copy GncEntry information from the list to the rows of the Ledger.

Definition at line 329 of file gncEntryLedgerLoad.c.

330{
331 GncEntry* blank_entry, *find_entry;
332 CursorBuffer* cursor_buffer;
333 Table* table;
334
335 GList* node;
336 CellBlock* cursor_header, *cursor;
337 VirtualCellLocation vcell_loc;
338 VirtualLocation save_loc;
339 gboolean start_primary_color = TRUE;
340
341 int new_entry_row = -1;
342
343 if (!ledger) return;
344
345 /* Load up cells */
346 load_discount_type_cells (ledger);
347 load_discount_how_cells (ledger);
348 gnc_entry_ledger_load_xfer_cells (ledger);
349
350 blank_entry = gnc_entry_ledger_get_blank_entry (ledger);
351
352 if (blank_entry == NULL && ledger->invoice == NULL && entry_list == NULL)
353 return;
354
355 if (blank_entry == NULL && ledger->invoice)
356 {
357 switch (ledger->type)
358 {
359 case GNCENTRY_ORDER_ENTRY:
360 case GNCENTRY_INVOICE_ENTRY:
361 case GNCENTRY_BILL_ENTRY:
362 case GNCENTRY_EXPVOUCHER_ENTRY:
363 case GNCENTRY_CUST_CREDIT_NOTE_ENTRY:
364 case GNCENTRY_VEND_CREDIT_NOTE_ENTRY:
365 case GNCENTRY_EMPL_CREDIT_NOTE_ENTRY:
366
367 gnc_suspend_gui_refresh();
368
369 blank_entry = gncEntryCreate (ledger->book);
370 gncEntrySetDateGDate (blank_entry, &ledger->last_date_entered);
371 ledger->blank_entry_guid = *gncEntryGetGUID (blank_entry);
372
373 gnc_resume_gui_refresh();
374
375 /* The rest of this does not apply to expense vouchers */
376 if (ledger->type != GNCENTRY_EXPVOUCHER_ENTRY)
377 {
378 const GncOwner* owner = gncOwnerGetEndOwner (gncInvoiceGetOwner (
379 ledger->invoice));
380 GncTaxTable* table = NULL;
382 gboolean taxincluded = FALSE;
383 gnc_numeric discount = gnc_numeric_zero();
384 gnc_numeric price = gnc_numeric_zero();
385
386 /* Determine the Price from Customer's or Vendor's Job */
387 switch (gncOwnerGetType (gncInvoiceGetOwner (ledger->invoice)))
388 {
389 case GNC_OWNER_JOB:
390 price = gncJobGetRate (gncOwnerGetJob (gncInvoiceGetOwner (ledger->invoice)));
391 break;
392 default:
393 break;
394 }
395
396 /* Determine the TaxIncluded and Discount values */
397 switch (gncOwnerGetType (owner))
398 {
399 case GNC_OWNER_CUSTOMER:
400 taxincluded_p = gncCustomerGetTaxIncluded (owner->owner.customer);
401 discount = gncCustomerGetDiscount (owner->owner.customer);
402 break;
403 case GNC_OWNER_VENDOR:
404 taxincluded_p = gncVendorGetTaxIncluded (owner->owner.vendor);
405 break;
406 default:
407 break;
408 }
409
410 /* Compute the default taxincluded */
411 switch (taxincluded_p)
412 {
414 taxincluded = TRUE;
415 break;
417 taxincluded = FALSE;
418 break;
420 if (ledger->prefs_group)
421 {
422 taxincluded = gnc_prefs_get_bool (ledger->prefs_group, GNC_PREF_TAX_INCL);
423 }
424 else
425 {
426 taxincluded = FALSE;
427 }
428 break;
429 }
430
431 /* Compute the proper taxtable */
432 switch (gncOwnerGetType (owner))
433 {
434 case GNC_OWNER_CUSTOMER:
435 table = gncTaxTableGetDefault (ledger->book,
436 GNC_OWNER_CUSTOMER);
437
438 if (gncCustomerGetTaxTableOverride (owner->owner.customer))
439 table = gncCustomerGetTaxTable (owner->owner.customer);
440 break;
441
442 case GNC_OWNER_VENDOR:
443 table = gncTaxTableGetDefault (ledger->book,
444 GNC_OWNER_VENDOR);
445
446 if (gncVendorGetTaxTableOverride (owner->owner.vendor))
447 table = gncVendorGetTaxTable (owner->owner.vendor);
448 break;
449
450 default:
451 break;
452 }
453
454 if (ledger->is_cust_doc)
455 {
456 gncEntrySetInvTaxable (blank_entry, table != NULL);
457 gncEntrySetInvTaxTable (blank_entry, table);
458 gncEntrySetInvTaxIncluded (blank_entry, taxincluded);
459 gncEntrySetInvDiscount (blank_entry, discount);
460 gncEntrySetInvPrice (blank_entry, price);
461 }
462 else
463 {
464 gncEntrySetBillTaxable (blank_entry, table != NULL);
465 gncEntrySetBillTaxTable (blank_entry, table);
466 gncEntrySetBillTaxIncluded (blank_entry, taxincluded);
467 gncEntrySetBillPrice (blank_entry, price);
468 }
469 }
470
471 break;
472 default:
473 ledger->blank_entry_guid = *guid_null();
474 break;
475 }
476 ledger->blank_entry_edited = FALSE;
477 }
478
479 table = ledger->table;
480
481 gnc_table_leave_update (table, table->current_cursor_loc);
482 save_loc = table->current_cursor_loc;
483
484 /* Figure out where we are going to */
485 if (ledger->traverse_to_new)
486 {
487 find_entry = blank_entry;
488 }
489 else if (ledger->hint_entry)
490 {
491 find_entry = ledger->hint_entry;
492 }
493 else
494 {
495 find_entry = gnc_entry_ledger_get_current_entry (ledger);
496 /* XXX: get current entry (cursor_hint_xxx) */
497 }
498
499 /* If the current cursor has changed we save the values for later
500 * possible restoration. */
501 if (gnc_table_current_cursor_changed (table, TRUE) &&
502 (find_entry == gnc_entry_ledger_get_current_entry (ledger)))
503 {
504 cursor_buffer = gnc_cursor_buffer_new();
505 gnc_table_save_current_cursor (table, cursor_buffer);
506 }
507 else
508 cursor_buffer = NULL;
509
510 /* disable move callback -- we don't want the cascade of
511 * callbacks while we are fiddling with loading the register */
512 gnc_table_control_allow_move (table->control, FALSE);
513
514 /* invalidate the cursor */
515 {
516 VirtualLocation virt_loc;
517
518 virt_loc.vcell_loc.virt_row = -1;
519 virt_loc.vcell_loc.virt_col = -1;
520 virt_loc.phys_row_offset = -1;
521 virt_loc.phys_col_offset = -1;
522
524 }
525
526 /* make sure that the header is loaded */
527 vcell_loc.virt_row = 0;
528 vcell_loc.virt_col = 0;
529 cursor_header = gnc_table_layout_get_cursor (table->layout, CURSOR_HEADER);
530 gnc_table_set_vcell (table, cursor_header, NULL, TRUE, TRUE, vcell_loc);
531 vcell_loc.virt_row++;
532
533 /* get the current time and reset the dividing row */
534 table->model->dividing_row_upper = -1;
535 table->model->dividing_row = -1;
536 table->model->dividing_row_lower = -1;
537 cursor = gnc_table_layout_get_cursor (table->layout, "cursor");
538
539 /* Populate the table */
540 for (node = entry_list; node; node = node->next)
541 {
542 GncEntry* entry = node->data;
543
544 /* Don't load the blank entry */
545 if (entry == blank_entry)
546 continue;
547
548 /* If this is the first load of the ledger, fill the quickfill cells */
549 {
550 /* XXX */
551 }
552
553 if (entry == find_entry)
554 new_entry_row = vcell_loc.virt_row;
555
556 gnc_table_set_vcell (table, cursor, gncEntryGetGUID (entry),
557 TRUE, start_primary_color, vcell_loc);
558 vcell_loc.virt_row++;
559
560 /* Flip color for the next guy */
561 start_primary_color = !start_primary_color;
562 }
563
564 /* Add the blank entry at the end. */
565 if (blank_entry)
566 {
567 gnc_table_set_vcell (table, cursor, gncEntryGetGUID (blank_entry),
568 TRUE, start_primary_color, vcell_loc);
569
570 if (find_entry == blank_entry)
571 new_entry_row = vcell_loc.virt_row;
572
573 vcell_loc.virt_row++;
574 }
575
576 /* Resize the table */
577 gnc_table_set_size (table, vcell_loc.virt_row, 1);
578
579 /* Restore the cursor to its rightful position */
580 if (new_entry_row > 0)
581 save_loc.vcell_loc.virt_row = new_entry_row;
582
583 if (gnc_table_find_close_valid_cell (table, &save_loc, FALSE))
584 {
586
587 if (find_entry == gnc_entry_ledger_get_current_entry (ledger))
588 gnc_table_restore_current_cursor (table, cursor_buffer);
589 }
590
591 gnc_cursor_buffer_destroy (cursor_buffer);
592 cursor_buffer = NULL;
593
594 /* Reset the ledger */
595 ledger->traverse_to_new = FALSE;
596 ledger->hint_entry = NULL;
597
598 /* Set the cell fractions */
599
600
602 gnc_entry_ledger_show_entry (ledger, table->current_cursor_loc.vcell_loc);
603
604 /* Set completion character */
606 ((ComboCell*)
607 gnc_table_layout_get_cell (table->layout, ENTRY_IACCT_CELL),
608 gnc_get_account_separator());
609
611 ((ComboCell*)
612 gnc_table_layout_get_cell (table->layout, ENTRY_BACCT_CELL),
613 gnc_get_account_separator());
614
615 /* enable callback for cursor user-driven moves */
616 gnc_table_control_allow_move (table->control, TRUE);
617}
void gnc_combo_cell_set_complete_char(ComboCell *cell, gunichar complete_char)
Sets a character used for special completion processing.
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
Definition guid.cpp:165
GncJob * gncOwnerGetJob(const GncOwner *owner)
If the given owner is of type GNC_OWNER_JOB, returns the pointer to the job object.
Definition gncOwner.c:376
const GncOwner * gncOwnerGetEndOwner(const GncOwner *owner)
Get the "parent" Owner or GncGUID thereof.
Definition gncOwner.c:572
GncOwnerType gncOwnerGetType(const GncOwner *owner)
Returns the GncOwnerType of this owner.
Definition gncOwner.c:200
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
void gnc_table_set_size(Table *table, int virt_rows, int virt_cols)
The gnc_table_set_size() method will resize the table to the indicated dimensions.
#define CURSOR_HEADER
Standard Cursor Names.
void gnc_table_set_vcell(Table *table, CellBlock *cursor, gconstpointer vcell_data, gboolean visible, gboolean start_primary_color, VirtualCellLocation vcell_loc)
Indicate what handler should be used for a given virtual block.
GncTaxIncluded
How to interpret the TaxIncluded.
Definition gncTaxTable.h:86
@ GNC_TAXINCLUDED_NO
tax is not included
Definition gncTaxTable.h:88
@ GNC_TAXINCLUDED_YES
tax is included
Definition gncTaxTable.h:87
@ GNC_TAXINCLUDED_USEGLOBAL
use the global setting
Definition gncTaxTable.h:89

◆ gnc_entry_ledger_load_xfer_cells()

void gnc_entry_ledger_load_xfer_cells ( GncEntryLedger *  ledger)

Definition at line 315 of file gncEntryLedgerLoad.c.

316{
317 load_xfer_type_cells (ledger);
318 load_taxtable_type_cells (ledger);
319 load_payment_type_cells (ledger);
320 load_description_cell (ledger);
321}

◆ gnc_entry_ledger_model_new()

TableModel * gnc_entry_ledger_model_new ( GncEntryLedgerType  type)

Public Interface.

Definition at line 1263 of file gncEntryLedgerModel.c.

1264{
1265 TableModel * model;
1266
1267 model = gnc_table_model_new ();
1268 gnc_entry_ledger_model_new_handlers (model, type);
1269
1270 return model;
1271}

◆ gnc_entry_ledger_move_current_entry_updown()

void gnc_entry_ledger_move_current_entry_updown ( GncEntryLedger *  ledger,
gboolean  move_up 
)

This implements the command of moving the current entry (where the cursor is currently located) one row upwards or downwards, effectively swapping this row and the other row.

If the other row is empty (or it is the blank entry), nothing will happen.

Parameters
move_upIf TRUE, the current entry is moved upwards, otherwise downwards.

Definition at line 983 of file gncEntryLedger.c.

985{
986 GncEntry *blank, *current, *target;
987 VirtualCellLocation vcell_loc;
988
989 g_assert(ledger);
990
991 blank = gnc_entry_ledger_get_blank_entry(ledger);
992 if (!blank)
993 return;
994
995 /* Ensure we have a valid current GncEntry and it isn't the blank
996 * entry */
997 current = gnc_entry_ledger_get_current_entry(ledger);
998 if (!current || current == blank)
999 return;
1000
1001 /* Obtain the GncEntry at the up or down virtual table location */
1002 vcell_loc = ledger->table->current_cursor_loc.vcell_loc;
1003 if (move_up)
1004 {
1005 if (vcell_loc.virt_row == 0)
1006 return;
1007 vcell_loc.virt_row--;
1008 }
1009 else
1010 {
1011 vcell_loc.virt_row++;
1012 }
1013
1014 /* Ensure we have a valid other GncEntry and it isn't the blank
1015 * entry */
1016 target = gnc_entry_ledger_get_entry(ledger, vcell_loc);
1017 if (!target || target == blank)
1018 return;
1019
1020 /* Also, only continue if both have the same date, because the
1021 * "standard ordering" is tied to the date anyway. Note: This
1022 * unfortunately prevents the user from changing the ordering if
1023 * he has chosen a different sort order and the sort key happens
1024 * to be equal among the two entries. But I don't know how to look
1025 * up the current sort ordering from here, so I cowardly refuse to
1026 * tweak the EntryDate in this case. */
1027 {
1028 time64 t1, t2;
1029 GDate d1 = gncEntryGetDateGDate(current),
1030 d2 = gncEntryGetDateGDate(target);
1031 if (g_date_compare(&d1, &d2) != 0)
1032 return;
1033
1034 /* Special treatment if the equality doesn't hold if we access the
1035 dates as time64. See the comment in gncEntrySetDateGDate() for the
1036 reason: Some code used the time64 at noon for the EntryDate, other
1037 code used the time64 at the start of day. */
1038 t1 = gncEntryGetDate(current);
1039 t2 = gncEntryGetDate(target);
1040 if (t1 != t2)
1041 {
1042 /* times are not equal, even though the GDates were equal? Then
1043 we set the GDates again. This will force the times to be equal
1044 as well. */
1045 gncEntrySetDateGDate(current, &d1);
1046 gncEntrySetDateGDate(target, &d2);
1047 }
1048 }
1049
1050 /*g_warning("Ok, current desc='%s' target desc='%s'",
1051 gncEntryGetDescription(current),
1052 gncEntryGetDescription(target));*/
1053
1054 gnc_suspend_gui_refresh ();
1055
1056 /* Swap the date-entered of both entries. That's already
1057 * sufficient! */
1058 {
1059 time64 time_current = gncEntryGetDateEntered(current);
1060 time64 time_target = gncEntryGetDateEntered(target);
1061
1062 /* Special treatment for identical times (potentially caused
1063 * by the "duplicate entry" command) */
1064 if (time_current == time_target)
1065 {
1066 /*g_warning("Surprise - both DateEntered are equal.");*/
1067 /* We just increment the DateEntered of the previously
1068 * lower of the two by one second. This might still cause
1069 * issues if multiple entries had this problem, but
1070 * whatever. */
1071 if (move_up)
1072 ++time_current;
1073 else
1074 ++time_target;
1075 }
1076
1077 /* Write the new DateEntered. */
1078 gncEntrySetDateEntered(current, time_target);
1079 gncEntrySetDateEntered(target, time_current);
1080
1081 /* And finally let the GncInvoice sort its entries
1082 * accordingly, so that the invoice reports will give the same
1083 * ordering as the register window. */
1084 gncInvoiceSortEntries(ledger->invoice);
1085 }
1086
1087 gnc_resume_gui_refresh ();
1088}
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
Definition gnc-date.h:87
GDate gncEntryGetDateGDate(const GncEntry *entry)
Returns the day of this entry.
Definition gncEntry.c:918
time64 gncEntryGetDate(const GncEntry *entry)
DEPRECATED - use gncEntryGetDateGDate() instead! (Because the time-of-day is a misleading extra infor...
Definition gncEntry.c:913
void gncInvoiceSortEntries(GncInvoice *invoice)
Call this function when an Entry is changed and you want to re-sort the list of entries.
Definition gncInvoice.c:750

◆ gnc_entry_ledger_new()

GncEntryLedger * gnc_entry_ledger_new ( QofBook book,
GncEntryLedgerType  type 
)

Create and return a new GncEntry Ledger.

Definition at line 274 of file gncEntryLedger.c.

275{
276 GncEntryLedger *ledger;
277
278 if (!book) return NULL;
279 if (type < 0 || type >= GNCENTRY_NUM_REGISTER_TYPES) return NULL;
280
281 ledger = g_new0 (GncEntryLedger, 1);
282 ledger->type = type;
283 ledger->book = book;
284 ledger->traverse_to_new = TRUE;
285 ledger->prefs_group = NULL;
286
287 /* Orders and Invoices are "invoices" for lookups */
288 switch (type)
289 {
290 case GNCENTRY_ORDER_ENTRY:
291 case GNCENTRY_ORDER_VIEWER:
292 case GNCENTRY_INVOICE_ENTRY:
293 case GNCENTRY_INVOICE_VIEWER:
294 ledger->is_cust_doc = TRUE;
295 ledger->is_credit_note = FALSE;
296 break;
297 case GNCENTRY_BILL_ENTRY:
298 case GNCENTRY_BILL_VIEWER:
299 case GNCENTRY_EXPVOUCHER_ENTRY:
300 case GNCENTRY_EXPVOUCHER_VIEWER:
301 case GNCENTRY_NUM_REGISTER_TYPES:
302 ledger->is_cust_doc = FALSE;
303 ledger->is_credit_note = FALSE;
304 break;
305 case GNCENTRY_CUST_CREDIT_NOTE_ENTRY:
306 case GNCENTRY_CUST_CREDIT_NOTE_VIEWER:
307 ledger->is_cust_doc = TRUE;
308 ledger->is_credit_note = TRUE;
309 break;
310 case GNCENTRY_VEND_CREDIT_NOTE_ENTRY:
311 case GNCENTRY_VEND_CREDIT_NOTE_VIEWER:
312 case GNCENTRY_EMPL_CREDIT_NOTE_ENTRY:
313 case GNCENTRY_EMPL_CREDIT_NOTE_VIEWER:
314 ledger->is_cust_doc = FALSE;
315 ledger->is_credit_note = TRUE;
316 break;
317 default:
318 PWARN ("Bad GncEntryLedgerType");
319 g_free (ledger);
320 return NULL;
321 break;
322 }
323
324 ledger->blank_entry_guid = *guid_null();
325 ledger->blank_entry_edited = FALSE;
326
327 {
328 GDate *today = gnc_g_date_new_today();
329 ledger->last_date_entered = *today;
330 g_date_free(today);
331 }
332
333 {
334 TableLayout *layout = gnc_entry_ledger_layout_new (ledger);
336 TableControl *control = gnc_entry_ledger_control_new ();
337 model->handler_user_data = ledger;
338 control->user_data = ledger;
339
340 ledger->table = gnc_table_new (layout, model, control);
341 }
342
343 gnc_entry_ledger_config_cells (ledger);
344
345 /* set up header */
346 {
347 VirtualCellLocation vcell_loc = { 0, 0 };
348 CellBlock *header;
349
350 header = gnc_table_layout_get_cursor (ledger->table->layout, CURSOR_HEADER);
351
352 gnc_table_set_vcell (ledger->table, header, NULL, TRUE, TRUE, vcell_loc);
353 }
354
355 /* set up first initial row */
356 {
357 VirtualLocation vloc;
358 CellBlock *cursor;
359
360 vloc.vcell_loc.virt_row = 1;
361 vloc.vcell_loc.virt_col = 0;
362 vloc.phys_row_offset = 0;
363 vloc.phys_col_offset = 0;
364
365 cursor = gnc_table_layout_get_cursor (ledger->table->layout, "cursor");
366
367 gnc_table_set_vcell (ledger->table, cursor, NULL, TRUE, TRUE, vloc.vcell_loc);
368
369 if (gnc_table_find_close_valid_cell (ledger->table, &vloc, FALSE))
370 gnc_table_move_cursor (ledger->table, vloc);
371 else
372 {
373 g_warning ("Can't find valid initial location");
374 }
375 }
376
377 /* Initialize Display */
378 gnc_entry_ledger_display_init (ledger);
379 if (qof_book_is_readonly(ledger->book))
380 {
381 gnc_entry_ledger_set_readonly(ledger, TRUE);
382 }
383 return ledger;
384}
gboolean qof_book_is_readonly(const QofBook *book)
Return whether the book is read only.
Definition qofbook.cpp:497
TableModel * gnc_entry_ledger_model_new(GncEntryLedgerType type)
Public Interface.
GDate * gnc_g_date_new_today()
Returns a newly allocated date of the current clock time, taken from time(2).
#define PWARN(format, args...)
Log a warning.
Definition qoflog.h:250
void gnc_table_move_cursor(Table *table, VirtualLocation new_virt_loc)
will move the cursor (but not the cursor GUI) to the indicated location.

◆ gnc_entry_ledger_reset_query()

void gnc_entry_ledger_reset_query ( GncEntryLedger *  ledger)

Definition at line 567 of file gncEntryLedger.c.

568{
569 if (!ledger) return;
570 if (!ledger->invoice) return;
571
572 create_invoice_query (ledger);
573 gnc_entry_ledger_display_refresh (ledger);
574}

◆ gnc_entry_ledger_set_default_invoice()

void gnc_entry_ledger_set_default_invoice ( GncEntryLedger *  ledger,
GncInvoice *  invoice 
)

Set the default invoice for this ledger.

Definition at line 544 of file gncEntryLedger.c.

546{
547 if (!ledger) return;
548 ledger->invoice = invoice;
549
550 /* For bills only, set the default date for new entries
551 * to the bill's opened date. This saves a lot of typing when
552 * adding bills on a day different from the bill's own date.
553 * Note this is for bills only, because for (customer's) invoices
554 * it makes more sense to use the current date.
555 * Consult https://bugs.gnucash.org/show_bug.cgi?id=646541
556 * to understand why.
557 */
558 if (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_VENDOR)
559 ledger->last_date_entered = time64_to_gdate(gncInvoiceGetDateOpened (invoice));
560
561 if (!ledger->query && invoice)
562 create_invoice_query (ledger);
563
564 gnc_entry_ledger_display_refresh (ledger);
565}
GDate time64_to_gdate(time64 t)
Returns the GDate in which the time64 occurs.

◆ gnc_entry_ledger_set_default_order()

void gnc_entry_ledger_set_default_order ( GncEntryLedger *  ledger,
GncOrder *  order 
)

Set the default order for this ledger.

Definition at line 405 of file gncEntryLedger.c.

407{
408 if (!ledger) return;
409 ledger->order = order;
410
411 if (!ledger->query && order)
412 {
413 ledger->query = qof_query_create_for (GNC_ENTRY_MODULE_NAME);
414 qof_query_set_book (ledger->query, gncOrderGetBook (order));
415 qof_query_add_guid_match (ledger->query,
416 g_slist_prepend (g_slist_prepend (NULL,
417 QOF_PARAM_GUID),
418 ENTRY_ORDER),
419 gncOrderGetGUID (order), QOF_QUERY_AND);
420 }
421 gnc_entry_ledger_display_refresh (ledger);
422}
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
DOCUMENT ME !!
void qof_query_set_book(QofQuery *query, QofBook *book)
Set the book to be searched.

◆ gnc_entry_ledger_set_parent()

void gnc_entry_ledger_set_parent ( GncEntryLedger *  ledger,
GtkWidget *  parent 
)

Definition at line 576 of file gncEntryLedger.c.

577{
578 if (!ledger) return;
579 ledger->parent = parent;
580}

◆ gnc_entry_ledger_set_prefs_group()

void gnc_entry_ledger_set_prefs_group ( GncEntryLedger *  ledger,
const gchar *  string 
)

Definition at line 975 of file gncEntryLedger.c.

976{
977 if (!ledger)
978 return;
979
980 ledger->prefs_group = string;
981}

◆ gnc_entry_ledger_set_readonly()

void gnc_entry_ledger_set_readonly ( GncEntryLedger *  ledger,
gboolean  readonly 
)

Definition at line 605 of file gncEntryLedger.c.

606{
607 if (!ledger) return;
608 if (!readonly && qof_book_is_readonly(ledger->book)) return;
609
610 /* reset the ledger type appropriately */
611 if (readonly)
612 {
613 switch (ledger->type)
614 {
615 case GNCENTRY_ORDER_ENTRY:
616 ledger->type = GNCENTRY_ORDER_VIEWER;
617 break;
618 case GNCENTRY_INVOICE_ENTRY:
619 ledger->type = GNCENTRY_INVOICE_VIEWER;
620 create_invoice_query (ledger);
621 break;
622 case GNCENTRY_BILL_ENTRY:
623 ledger->type = GNCENTRY_BILL_VIEWER;
624 create_invoice_query (ledger);
625 break;
626 case GNCENTRY_EXPVOUCHER_ENTRY:
627 ledger->type = GNCENTRY_EXPVOUCHER_VIEWER;
628 create_invoice_query (ledger);
629 break;
630 case GNCENTRY_CUST_CREDIT_NOTE_ENTRY:
631 ledger->type = GNCENTRY_CUST_CREDIT_NOTE_VIEWER;
632 create_invoice_query (ledger);
633 break;
634 case GNCENTRY_VEND_CREDIT_NOTE_ENTRY:
635 ledger->type = GNCENTRY_VEND_CREDIT_NOTE_VIEWER;
636 create_invoice_query (ledger);
637 break;
638 case GNCENTRY_EMPL_CREDIT_NOTE_ENTRY:
639 ledger->type = GNCENTRY_EMPL_CREDIT_NOTE_VIEWER;
640 create_invoice_query (ledger);
641 break;
642 default:
643 return; /* Nothing to do */
644 }
645 }
646 else
647 {
648 switch (ledger->type)
649 {
650 case GNCENTRY_ORDER_VIEWER:
651 ledger->type = GNCENTRY_ORDER_ENTRY;
652 break;
653 case GNCENTRY_INVOICE_VIEWER:
654 ledger->type = GNCENTRY_INVOICE_ENTRY;
655 create_invoice_query (ledger);
656 break;
657 case GNCENTRY_BILL_VIEWER:
658 ledger->type = GNCENTRY_BILL_ENTRY;
659 create_invoice_query (ledger);
660 break;
661 case GNCENTRY_EXPVOUCHER_VIEWER:
662 ledger->type = GNCENTRY_EXPVOUCHER_ENTRY;
663 create_invoice_query (ledger);
664 break;
665 case GNCENTRY_CUST_CREDIT_NOTE_VIEWER:
666 ledger->type = GNCENTRY_CUST_CREDIT_NOTE_ENTRY;
667 create_invoice_query (ledger);
668 break;
669 case GNCENTRY_VEND_CREDIT_NOTE_VIEWER:
670 ledger->type = GNCENTRY_VEND_CREDIT_NOTE_ENTRY;
671 create_invoice_query (ledger);
672 break;
673 case GNCENTRY_EMPL_CREDIT_NOTE_VIEWER:
674 ledger->type = GNCENTRY_EMPL_CREDIT_NOTE_ENTRY;
675 create_invoice_query (ledger);
676 break;
677 default:
678 return; /* Nothing to do */
679 }
680 }
681
682 /* reset the model */
683 gnc_table_model_set_read_only (ledger->table->model, readonly);
684
685 /* if readonly is TRUE, get rid of the blank entry. */
686 if (readonly)
687 gnc_entry_ledger_clear_blank_entry (ledger);
688
689 /* and refresh the display */
690 gnc_entry_ledger_display_refresh (ledger);
691}

◆ gnc_entry_ledger_type_string_getter()

const char * gnc_entry_ledger_type_string_getter ( char  flag)

Definition at line 48 of file gncEntryLedgerLoad.c.

49{
50 switch (flag)
51 {
52 case '1':
53 return _ ("$");
54 case '2':
55 return _ ("%");
56 default:
57 break;
58 };
59 return "?";
60}