GnuCash  4.11-11-ge9df8d41d2+
Files | Data Structures | Macros | Typedefs | Enumerations | Functions

Splits are grouped into Accounts which are also known as "Ledgers" in accounting practice. More...

Files

file  Account.h
 Account handling public routines.
 

Data Structures

struct  AccountClass
 
struct  GncImportMatchMap
 

Macros

#define GNC_TYPE_ACCOUNT   (gnc_account_get_type ())
 
#define GNC_ACCOUNT(o)   (G_TYPE_CHECK_INSTANCE_CAST ((o), GNC_TYPE_ACCOUNT, Account))
 
#define GNC_ACCOUNT_CLASS(k)   (G_TYPE_CHECK_CLASS_CAST((k), GNC_TYPE_ACCOUNT, AccountClass))
 
#define GNC_IS_ACCOUNT(o)   (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNC_TYPE_ACCOUNT))
 
#define GNC_IS_ACCOUNT_CLASS(k)   (G_TYPE_CHECK_CLASS_TYPE ((k), GNC_TYPE_ACCOUNT))
 
#define GNC_ACCOUNT_GET_CLASS(o)   (G_TYPE_INSTANCE_GET_CLASS ((o), GNC_TYPE_ACCOUNT, AccountClass))
 

Typedefs

typedef gnc_numeric(* xaccGetBalanceFn) (const Account *account)
 
typedef gnc_numeric(* xaccGetBalanceInCurrencyFn) (const Account *account, const gnc_commodity *report_commodity, gboolean include_children)
 
typedef gnc_numeric(* xaccGetBalanceAsOfDateFn) (Account *account, time64 date)
 
typedef void(* AccountCb) (Account *a, gpointer data)
 
typedef gpointer(* AccountCb2) (Account *a, gpointer data)
 

Enumerations

enum  GNCAccountType {
  ACCT_TYPE_INVALID = -1, ACCT_TYPE_NONE = -1, ACCT_TYPE_BANK = 0, ACCT_TYPE_CASH = 1,
  ACCT_TYPE_CREDIT = 3, ACCT_TYPE_ASSET = 2, ACCT_TYPE_LIABILITY = 4, ACCT_TYPE_STOCK = 5,
  ACCT_TYPE_MUTUAL = 6, ACCT_TYPE_CURRENCY = 7, ACCT_TYPE_INCOME = 8, ACCT_TYPE_EXPENSE = 9,
  ACCT_TYPE_EQUITY = 10, ACCT_TYPE_RECEIVABLE = 11, ACCT_TYPE_PAYABLE = 12, ACCT_TYPE_ROOT = 13,
  ACCT_TYPE_TRADING = 14, NUM_ACCOUNT_TYPES = 15, ACCT_TYPE_CHECKING = 15, ACCT_TYPE_SAVINGS = 16,
  ACCT_TYPE_MONEYMRKT = 17, ACCT_TYPE_CREDITLINE = 18, ACCT_TYPE_LAST
}
 The account types are used to determine how the transaction data in the account is displayed. More...
 

Functions

GType gnc_account_get_type (void)
 Returns the GType type system description of the Account class. More...
 
gboolean gnc_account_and_descendants_empty (Account *acc)
 
gchar * gnc_account_name_violations_errmsg (const gchar *separator, GList *invalid_account_names)
 Composes a translatable error message showing which account names clash with the current account separator. More...
 
GList * gnc_account_list_name_violations (QofBook *book, const gchar *separator)
 Runs through all the accounts and returns a list of account names that contain the provided separator character. More...
 
void xaccAccountSetReconcileChildrenStatus (Account *account, gboolean status)
 DOCUMENT ME!
 
gboolean xaccAccountGetReconcileChildrenStatus (const Account *account)
 DOCUMENT ME!
 
gboolean xaccAccountHasAncestor (const Account *acc, const Account *ancestor)
 Returns true if the account is 'ancestor' or has 'ancestor' as an ancestor. More...
 

Account Constructors, Edit/Commit, Comparison

AccountxaccMallocAccount (QofBook *book)
 Constructor.
 
Accountgnc_account_create_root (QofBook *book)
 Create a new root level account. More...
 
AccountxaccCloneAccount (const Account *source, QofBook *book)
 The xaccCloneAccount() routine makes a simple copy of the indicated account, placing it in the indicated book. More...
 
void xaccAccountBeginEdit (Account *account)
 The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account updates. More...
 
void xaccAccountCommitEdit (Account *account)
 ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account updates. More...
 
void xaccAccountDestroy (Account *account)
 The xaccAccountDestroy() routine can be used to get rid of an account. More...
 
gboolean xaccAccountEqual (const Account *a, const Account *b, gboolean check_guids)
 Compare two accounts for equality - this is a deep compare. More...
 
int xaccAccountOrder (const Account *account_1, const Account *account_2)
 The xaccAccountOrder() subroutine defines a sorting order on accounts. More...
 

Account lookup and GncGUID routines

const gchar * gnc_get_account_separator_string (void)
 Returns the account separation character chosen by the user. More...
 
gunichar gnc_get_account_separator (void)
 
void gnc_set_account_separator (const gchar *separator)
 
Accountgnc_book_get_root_account (QofBook *book)
 
void gnc_book_set_root_account (QofBook *book, Account *root)
 
AccountxaccAccountLookup (const GncGUID *guid, QofBook *book)
 The xaccAccountLookup() subroutine will return the account associated with the given id, or NULL if there is no such account. More...
 
#define xaccAccountGetGUID(X)   qof_entity_get_guid(QOF_INSTANCE(X))
 
#define xaccAccountReturnGUID(X)   (X ? *(qof_entity_get_guid(QOF_INSTANCE(X))) : *(guid_null()))
 
#define xaccAccountLookupDirect(g, b)   xaccAccountLookup(&(g),b)
 

Account general setters/getters

QofBook * gnc_account_get_book (const Account *account)
 
void xaccAccountSetType (Account *account, GNCAccountType)
 Set the account's type.
 
void xaccAccountSetName (Account *account, const char *name)
 Set the account's name.
 
void xaccAccountSetCode (Account *account, const char *code)
 Set the account's accounting code.
 
void xaccAccountSetDescription (Account *account, const char *desc)
 Set the account's description.
 
void xaccAccountSetColor (Account *account, const char *color)
 Set the account's Color.
 
void xaccAccountSetFilter (Account *account, const char *filter)
 Set the account's Filter.
 
void xaccAccountSetSortOrder (Account *account, const char *sortorder)
 Set the account's Sort Order.
 
void xaccAccountSetSortReversed (Account *account, gboolean sortreversed)
 Set the account's Sort Order direction.
 
void xaccAccountSetNotes (Account *account, const char *notes)
 Set the account's notes.
 
void xaccAccountSetLastNum (Account *account, const char *num)
 Set the last num field of an Account.
 
void gnc_account_set_policy (Account *account, GNCPolicy *policy)
 Set the account's lot order policy.
 
GNCAccountType xaccAccountGetType (const Account *account)
 Returns the account's account type. More...
 
gboolean xaccAccountIsPriced (const Account *acc)
 Returns true if the account is a stock, mutual fund or currency, otherwise false. More...
 
void gnc_account_set_start_balance (Account *acc, const gnc_numeric start_baln)
 This function will set the starting commodity balance for this account. More...
 
void gnc_account_set_start_cleared_balance (Account *acc, const gnc_numeric start_baln)
 This function will set the starting cleared commodity balance for this account. More...
 
void gnc_account_set_start_reconciled_balance (Account *acc, const gnc_numeric start_baln)
 This function will set the starting reconciled commodity balance for this account. More...
 
void gnc_account_set_balance_dirty (Account *acc)
 Tell the account that the running balances may be incorrect and need to be recomputed. More...
 
void gnc_account_set_sort_dirty (Account *acc)
 Tell the account believes that the splits may be incorrectly sorted and need to be resorted. More...
 
void gnc_account_set_defer_bal_computation (Account *acc, gboolean defer)
 Set the defer balance flag. More...
 
gboolean gnc_account_insert_split (Account *acc, Split *s)
 Insert the given split from an account. More...
 
gboolean gnc_account_remove_split (Account *acc, Split *s)
 Remove the given split from an account. More...
 
const char * xaccAccountGetName (const Account *account)
 Get the account's name.
 
const char * xaccAccountGetCode (const Account *account)
 Get the account's accounting code.
 
const char * xaccAccountGetDescription (const Account *account)
 Get the account's description.
 
const char * xaccAccountGetColor (const Account *account)
 Get the account's color.
 
const char * xaccAccountGetFilter (const Account *account)
 Get the account's filter.
 
const char * xaccAccountGetSortOrder (const Account *account)
 Get the account's Sort Order.
 
gboolean xaccAccountGetSortReversed (const Account *account)
 Get the account's Sort Order direction.
 
const char * xaccAccountGetNotes (const Account *account)
 Get the account's notes.
 
const char * xaccAccountGetLastNum (const Account *account)
 Get the last num field of an Account.
 
GNCPolicy * gnc_account_get_policy (Account *account)
 Get the account's lot order policy.
 
gboolean gnc_account_get_defer_bal_computation (Account *acc)
 Get the account's flag for deferred balance computation.
 
void xaccAccountRecomputeBalance (Account *)
 The following recompute the partial balances (stored with the transaction) and the total balance, for this account.
 
void xaccAccountSortSplits (Account *acc, gboolean force)
 The xaccAccountSortSplits() routine will resort the account's splits if the sort is dirty. More...
 
gchar * gnc_account_get_full_name (const Account *account)
 The gnc_account_get_full_name routine returns the fully qualified name of the account using the given separator char. More...
 
AccountxaccAccountGainsAccount (Account *acc, gnc_commodity *curr)
 Retrieve the gains account used by this account for the indicated currency, creating and recording a new one if necessary. More...
 
void dxaccAccountSetPriceSrc (Account *account, const char *src)
 Set a string that identifies the Finance::Quote backend that should be used to retrieve online prices. More...
 
const char * dxaccAccountGetPriceSrc (const Account *account)
 Get a string that identifies the Finance::Quote backend that should be used to retrieve online prices. More...
 

Account Commodity setters/getters

Accounts are used to store an amount of 'something', that 'something'
is called the 'commodity'.

An account can only hold one kind of commodity. The following are used to get and set the commodity, and also to set the SCU, the 'Smallest Commodity Unit'.

Note that when we say that a 'split' holds an 'amount', that amount is denominated in the account commodity. Do not confuse 'amount' and 'value'. The 'value' of a split is the value of the amount expressed in the currency of the transaction. Thus, for example, the 'amount' may be 12 apples, where the account commodity is 'apples'. The value of these 12 apples may be 12 dollars, where the transaction currency is 'dollars'.

The SCU is the 'Smallest Commodity Unit', signifying the smallest non-zero amount that can be stored in the account. It is represented as the integer denominator of a fraction. Thus, for example, a SCU of 12 means that 1/12 of something is the smallest amount that can be stored in the account. SCU's can be any value; they do not need to be decimal. This allows the use of accounts with unusual, non-decimal commodities and currencies.

Normally, the SCU is determined by the commodity of the account. However, this default SCU can be over-ridden and set to an account-specific value. This is account-specific value is called the 'non-standard' value in the documentation below.

void xaccAccountSetCommodity (Account *account, gnc_commodity *comm)
 Set the account's commodity.
 
gnc_commodity * xaccAccountGetCommodity (const Account *account)
 Get the account's commodity.
 
gnc_commodity * gnc_account_get_currency_or_parent (const Account *account)
 Returns a gnc_commodity that is a currency, suitable for being a Transaction's currency. More...
 
int xaccAccountGetCommoditySCU (const Account *account)
 Return the SCU for the account. More...
 
int xaccAccountGetCommoditySCUi (const Account *account)
 Return the 'internal' SCU setting. More...
 
void xaccAccountSetCommoditySCU (Account *account, int frac)
 Set the SCU for the account. More...
 
void xaccAccountSetNonStdSCU (Account *account, gboolean flag)
 Set the flag indicating that this account uses a non-standard SCU. More...
 
gboolean xaccAccountGetNonStdSCU (const Account *account)
 Return boolean, indicating whether this account uses a non-standard SCU. More...
 

Account Balance

gnc_numeric xaccAccountGetBalance (const Account *account)
 Get the current balance of the account, which may include future splits.
 
gnc_numeric xaccAccountGetClearedBalance (const Account *account)
 Get the current balance of the account, only including cleared transactions.
 
gnc_numeric xaccAccountGetReconciledBalance (const Account *account)
 Get the current balance of the account, only including reconciled transactions.
 
gnc_numeric xaccAccountGetPresentBalance (const Account *account)
 
gnc_numeric xaccAccountGetProjectedMinimumBalance (const Account *account)
 
gnc_numeric xaccAccountGetBalanceAsOfDate (Account *account, time64 date)
 Get the balance of the account at the end of the day before the date specified. More...
 
gnc_numeric xaccAccountGetReconciledBalanceAsOfDate (Account *account, time64 date)
 Get the reconciled balance of the account at the end of the day of the date specified. More...
 
gnc_numeric xaccAccountConvertBalanceToCurrency (const Account *account, gnc_numeric balance, const gnc_commodity *balance_currency, const gnc_commodity *new_currency)
 
gnc_numeric xaccAccountConvertBalanceToCurrencyAsOfDate (const Account *account, gnc_numeric balance, const gnc_commodity *balance_currency, const gnc_commodity *new_currency, time64 date)
 
gnc_numeric xaccAccountGetBalanceInCurrency (const Account *account, const gnc_commodity *report_commodity, gboolean include_children)
 
gnc_numeric xaccAccountGetClearedBalanceInCurrency (const Account *account, const gnc_commodity *report_commodity, gboolean include_children)
 
gnc_numeric xaccAccountGetReconciledBalanceInCurrency (const Account *account, const gnc_commodity *report_commodity, gboolean include_children)
 
gnc_numeric xaccAccountGetPresentBalanceInCurrency (const Account *account, const gnc_commodity *report_commodity, gboolean include_children)
 
gnc_numeric xaccAccountGetProjectedMinimumBalanceInCurrency (const Account *account, const gnc_commodity *report_commodity, gboolean include_children)
 
gnc_numeric xaccAccountGetNoclosingBalanceAsOfDateInCurrency (Account *acc, time64 date, gnc_commodity *report_commodity, gboolean include_children)
 This function gets the balance at the end of the given date, ignoring closing entries, in the desired commodity. More...
 
gnc_numeric xaccAccountGetBalanceAsOfDateInCurrency (Account *account, time64 date, gnc_commodity *report_commodity, gboolean include_children)
 This function gets the balance at the end of the given date in the desired commodity. More...
 
gnc_numeric xaccAccountGetNoclosingBalanceChangeForPeriod (Account *acc, time64 date1, time64 date2, gboolean recurse)
 
gnc_numeric xaccAccountGetBalanceChangeForPeriod (Account *acc, time64 date1, time64 date2, gboolean recurse)
 

Account Children and Parents.

The set of accounts is represented as a doubly-linked tree, so that given any account, both its parent and its children can be easily found.

At the top of the tree hierarchy lies a single root node, the root account.

The account tree hierarchy is unique, in that a given account can have only one parent account.

void gnc_account_append_child (Account *new_parent, Account *child)
 This function will remove from the child account any pre-existing parent relationship, and will then add the account as a child of the new parent. More...
 
void gnc_account_remove_child (Account *parent, Account *child)
 This function will remove the specified child account from the specified parent account. More...
 
Accountgnc_account_get_parent (const Account *account)
 This routine returns a pointer to the parent of the specified account. More...
 
Accountgnc_account_get_root (Account *account)
 This routine returns the root account of the account tree that the specified account belongs to. More...
 
gboolean gnc_account_is_root (const Account *account)
 This routine indicates whether the specified account is the root node of an account tree. More...
 
GList * gnc_account_get_children (const Account *account)
 This routine returns a GList of all children accounts of the specified account. More...
 
GList * gnc_account_get_children_sorted (const Account *account)
 This routine returns a GList of all children accounts of the specified account, ordered by xaccAccountOrder(). More...
 
gint gnc_account_n_children (const Account *account)
 Return the number of children of the specified account. More...
 
gint gnc_account_child_index (const Account *parent, const Account *child)
 Return the index of the specified child within the list of the parent's children. More...
 
Accountgnc_account_nth_child (const Account *parent, gint num)
 Return the n'th child account of the specified parent account. More...
 
GList * gnc_account_get_descendants (const Account *account)
 This routine returns a flat list of all of the accounts that are descendants of the specified account. More...
 
GList * gnc_account_get_descendants_sorted (const Account *account)
 This function returns a GList containing all the descendants of the specified account, sorted at each level. More...
 
gint gnc_account_n_descendants (const Account *account)
 Return the number of descendants of the specified account. More...
 
gint gnc_account_get_current_depth (const Account *account)
 Return the number of levels of this account below the root account. More...
 
gint gnc_account_get_tree_depth (const Account *account)
 Return the number of levels of descendants accounts below the specified account. More...
 

ForEach

void gnc_account_foreach_child (const Account *account, AccountCb func, gpointer user_data)
 This method will traverse the immediate children of this accounts, calling 'func' on each account. More...
 
void gnc_account_foreach_descendant (const Account *account, AccountCb func, gpointer user_data)
 This method will traverse all children of this accounts and their descendants, calling 'func' on each account. More...
 
gpointer gnc_account_foreach_descendant_until (const Account *account, AccountCb2 func, gpointer user_data)
 This method will traverse all children of this accounts and their descendants, calling 'func' on each account. More...
 

Concatenation, Merging

void gnc_account_join_children (Account *to_parent, Account *from_parent)
 The gnc_account_join_children() subroutine will move (reparent) all child accounts from the from_parent account to the to_parent account, preserving the account hierarchy. More...
 
void gnc_account_merge_children (Account *parent)
 The gnc_account_merge_children() subroutine will go through an account, merging all child accounts that have the same name and description. More...
 

Detailed Description

Splits are grouped into Accounts which are also known as "Ledgers" in accounting practice.

Each Account consists of a list of Splits that debit that Account. To ensure consistency, if a Split points to an Account, then the Account must point to the Split, and vice-versa. A Split can belong to at most one Account. Besides merely containing a list of Splits, the Account structure also gives the Account a name, a code number, description and notes fields, a key-value frame, a pointer to the commodity that is used for all splits in this account. The commodity can be the name of anything traded and tradeable: a stock (e.g. "IBM", "McDonald's"), a currency (e.g. "USD", "GBP"), or anything added to the commodity table.

Accounts can be arranged in a hierarchical tree. By accounting convention, the value of an Account is equal to the value of all of its Splits plus the value of all of its sub-Accounts.

Macro Definition Documentation

◆ xaccAccountGetGUID

#define xaccAccountGetGUID (   X)    qof_entity_get_guid(QOF_INSTANCE(X))
Deprecated:

Definition at line 248 of file Account.h.

Enumeration Type Documentation

◆ GNCAccountType

The account types are used to determine how the transaction data in the account is displayed.

These values can be safely changed from one release to the next. Note that if values are added, the file IO translation routines need to be updated. Note also that GUI code depends on these numbers.

Note
IMPORTANT: If you do change the enumeration names (not the numbers), you need to update xaccAccountTypeEnumAsString — used for text file exports
Enumerator
ACCT_TYPE_INVALID 

Not a type.

ACCT_TYPE_NONE 

Not a type.

ACCT_TYPE_BANK 

The bank account type denotes a savings or checking account held at a bank.

Often interest bearing.

ACCT_TYPE_CASH 

The cash account type is used to denote a shoe-box or pillowcase stuffed with * cash.

ACCT_TYPE_CREDIT 

The Credit card account is used to denote credit (e.g.

amex) and debit (e.g. visa, mastercard) card accounts

ACCT_TYPE_ASSET 

asset (and liability) accounts indicate generic, generalized accounts that are none of the above.

ACCT_TYPE_LIABILITY 

liability (and asset) accounts indicate generic, generalized accounts that are none of the above.

ACCT_TYPE_STOCK 

Stock accounts will typically be shown in registers which show three columns: price, number of shares, and value.

ACCT_TYPE_MUTUAL 

Mutual Fund accounts will typically be shown in registers which show three columns: price, number of shares, and value.

ACCT_TYPE_CURRENCY 

The currency account type indicates that the account is a currency trading account.

In many ways, a currency trading account is like a stock * trading account. It is shown in the register with three columns: price, number of shares, and value. Note: Since version 1.7.0, this account is * no longer needed to exchange currencies between accounts, so this type is DEPRECATED.

ACCT_TYPE_INCOME 

Income accounts are used to denote income.

ACCT_TYPE_EXPENSE 

Expense accounts are used to denote expenses.

ACCT_TYPE_EQUITY 

Equity account is used to balance the balance sheet.

ACCT_TYPE_RECEIVABLE 

A/R account type.

ACCT_TYPE_PAYABLE 

A/P account type.

ACCT_TYPE_ROOT 

The hidden root account of an account tree.

ACCT_TYPE_TRADING 

Account used to record multiple commodity transactions.

This is not the same as ACCT_TYPE_CURRENCY above. Multiple commodity transactions have splits in these accounts to make the transaction balance in each commodity as well as in total value.

NUM_ACCOUNT_TYPES 

stop here; the following types just aren't ready for prime time

ACCT_TYPE_CHECKING 

bank account type – don't use this for now, see NUM_ACCOUNT_TYPES

ACCT_TYPE_SAVINGS 

bank account type – don't use this for now, see NUM_ACCOUNT_TYPES

ACCT_TYPE_MONEYMRKT 

bank account type – don't use this for now, see NUM_ACCOUNT_TYPES

ACCT_TYPE_CREDITLINE 

line of credit – don't use this for now, see NUM_ACCOUNT_TYPES

Definition at line 105 of file Account.h.

106 {
107  ACCT_TYPE_INVALID = -1,
108  ACCT_TYPE_NONE = -1,
110  ACCT_TYPE_BANK = 0,
113  ACCT_TYPE_CASH = 1,
116  ACCT_TYPE_CREDIT = 3,
119  ACCT_TYPE_ASSET = 2,
125  ACCT_TYPE_STOCK = 5,
128  ACCT_TYPE_MUTUAL = 6,
132  ACCT_TYPE_CURRENCY = 7,
143  ACCT_TYPE_INCOME = 8,
146  ACCT_TYPE_EXPENSE = 9,
149  ACCT_TYPE_EQUITY = 10,
154  ACCT_TYPE_PAYABLE = 12,
156  ACCT_TYPE_ROOT = 13,
158  ACCT_TYPE_TRADING = 14,
164  NUM_ACCOUNT_TYPES = 15,
167  /* bank account types */
168  ACCT_TYPE_CHECKING = 15,
170  ACCT_TYPE_SAVINGS = 16,
172  ACCT_TYPE_MONEYMRKT = 17,
174  ACCT_TYPE_CREDITLINE = 18,
176  ACCT_TYPE_LAST
Expense accounts are used to denote expenses.
Definition: Account.h:146
Mutual Fund accounts will typically be shown in registers which show three columns: price...
Definition: Account.h:128
stop here; the following types just aren't ready for prime time
Definition: Account.h:164
The cash account type is used to denote a shoe-box or pillowcase stuffed with * cash.
Definition: Account.h:113
Account used to record multiple commodity transactions.
Definition: Account.h:158
Stock accounts will typically be shown in registers which show three columns: price, number of shares, and value.
Definition: Account.h:125
bank account type – don't use this for now, see NUM_ACCOUNT_TYPES
Definition: Account.h:168
Income accounts are used to denote income.
Definition: Account.h:143
line of credit – don't use this for now, see NUM_ACCOUNT_TYPES
Definition: Account.h:174
The bank account type denotes a savings or checking account held at a bank.
Definition: Account.h:110
A/P account type.
Definition: Account.h:154
bank account type – don't use this for now, see NUM_ACCOUNT_TYPES
Definition: Account.h:170
asset (and liability) accounts indicate generic, generalized accounts that are none of the above...
Definition: Account.h:119
The currency account type indicates that the account is a currency trading account.
Definition: Account.h:132
GNCAccountType
The account types are used to determine how the transaction data in the account is displayed...
Definition: Account.h:105
Not a type.
Definition: Account.h:107
liability (and asset) accounts indicate generic, generalized accounts that are none of the above...
Definition: Account.h:122
A/R account type.
Definition: Account.h:152
bank account type – don't use this for now, see NUM_ACCOUNT_TYPES
Definition: Account.h:172
Equity account is used to balance the balance sheet.
Definition: Account.h:149
Not a type.
Definition: Account.h:108
The hidden root account of an account tree.
Definition: Account.h:156
The Credit card account is used to denote credit (e.g.
Definition: Account.h:116

Function Documentation

◆ dxaccAccountGetPriceSrc()

const char* dxaccAccountGetPriceSrc ( const Account account)

Get a string that identifies the Finance::Quote backend that should be used to retrieve online prices.

See price-quotes.scm for more information. This function uses a static char*.

Deprecated:
Price quote information is now stored on the commodity, not the account.

Definition at line 5052 of file Account.cpp.

5053 {
5054  static char *source = nullptr;
5055  if (!acc) return NULL;
5056 
5057  if (!xaccAccountIsPriced(acc)) return NULL;
5058 
5059  g_free (source);
5060  source = get_kvp_string_tag (acc, "old-price-source");
5061  return source;
5062 }
gboolean xaccAccountIsPriced(const Account *acc)
Returns true if the account is a stock, mutual fund or currency, otherwise false. ...
Definition: Account.cpp:4712

◆ dxaccAccountSetPriceSrc()

void dxaccAccountSetPriceSrc ( Account account,
const char *  src 
)

Set a string that identifies the Finance::Quote backend that should be used to retrieve online prices.

See price-quotes.scm for more information

Deprecated:
Price quote information is now stored on the commodity, not the account.

Definition at line 5040 of file Account.cpp.

5041 {
5042  if (!acc) return;
5043 
5044  if (xaccAccountIsPriced(acc))
5045  set_kvp_string_tag (acc, "old-price-source", src);
5046 }
gboolean xaccAccountIsPriced(const Account *acc)
Returns true if the account is a stock, mutual fund or currency, otherwise false. ...
Definition: Account.cpp:4712

◆ gnc_account_append_child()

void gnc_account_append_child ( Account new_parent,
Account child 
)

This function will remove from the child account any pre-existing parent relationship, and will then add the account as a child of the new parent.

The exception to this is when the old and new parent accounts are the same, in which case this function does nothing.

If the child account belongs to a different book than the specified new parent account, the child will be removed from the other book (and thus, the other book's entity tables, generating a destroy event), and will be added to the new book (generating a create event).

Parameters
new_parentThe new parent account to which the child should be attached.
childThe account to attach.

Definition at line 2801 of file Account.cpp.

2802 {
2803  AccountPrivate *ppriv, *cpriv;
2804  Account *old_parent;
2805  QofCollection *col;
2806 
2807  /* errors */
2808  g_assert(GNC_IS_ACCOUNT(new_parent));
2809  g_assert(GNC_IS_ACCOUNT(child));
2810 
2811  /* optimizations */
2812  ppriv = GET_PRIVATE(new_parent);
2813  cpriv = GET_PRIVATE(child);
2814  old_parent = cpriv->parent;
2815  if (old_parent == new_parent)
2816  return;
2817 
2818  // xaccAccountBeginEdit(new_parent);
2819  xaccAccountBeginEdit(child);
2820  if (old_parent)
2821  {
2822  gnc_account_remove_child(old_parent, child);
2823 
2824  if (!qof_instance_books_equal(old_parent, new_parent))
2825  {
2826  /* hack alert -- this implementation is not exactly correct.
2827  * If the entity tables are not identical, then the 'from' book
2828  * may have a different backend than the 'to' book. This means
2829  * that we should get the 'from' backend to destroy this account,
2830  * and the 'to' backend to save it. Right now, this is broken.
2831  *
2832  * A 'correct' implementation similar to this is in Period.c
2833  * except its for transactions ...
2834  *
2835  * Note also, we need to reparent the children to the new book as well.
2836  */
2837  PWARN ("reparenting accounts across books is not correctly supported\n");
2838 
2839  qof_event_gen (&child->inst, QOF_EVENT_DESTROY, NULL);
2841  GNC_ID_ACCOUNT);
2842  qof_collection_insert_entity (col, &child->inst);
2843  qof_event_gen (&child->inst, QOF_EVENT_CREATE, NULL);
2844  }
2845  }
2846  cpriv->parent = new_parent;
2847  ppriv->children = g_list_append(ppriv->children, child);
2848  qof_instance_set_dirty(&new_parent->inst);
2849  qof_instance_set_dirty(&child->inst);
2850 
2851  /* Send events data. Warning: The call to commit_edit is also going
2852  * to send a MODIFY event. If the gtktreemodelfilter code gets the
2853  * MODIFY before it gets the ADD, it gets very confused and thinks
2854  * that two nodes have been added. */
2855  qof_event_gen (&child->inst, QOF_EVENT_ADD, NULL);
2856  // qof_event_gen (&new_parent->inst, QOF_EVENT_MODIFY, NULL);
2857 
2858  xaccAccountCommitEdit (child);
2859  // xaccAccountCommitEdit(new_parent);
2860 }
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
#define PWARN(format, args...)
Log a warning.
Definition: qoflog.h:250
void gnc_account_remove_child(Account *parent, Account *child)
This function will remove the specified child account from the specified parent account.
Definition: Account.cpp:2863
void qof_collection_insert_entity(QofCollection *, QofInstance *)
Take entity, remove it from whatever collection its currently in, and place it in a new collection...
Definition: qofid.cpp:98
gboolean qof_instance_books_equal(gconstpointer ptr1, gconstpointer ptr2)
See if two QofInstances share the same book.
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
Definition: Account.cpp:1449
QofCollection * qof_book_get_collection(const QofBook *book, QofIdType entity_type)
Return The table of entities of the given type.
Definition: qofbook.cpp:604
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
Definition: qofevent.cpp:231
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
Definition: Account.cpp:1490

◆ gnc_account_child_index()

gint gnc_account_child_index ( const Account parent,
const Account child 
)

Return the index of the specified child within the list of the parent's children.

The first child index is 0. This function returns -1 if the parent account is NULL of if the specified child does not belong to the parent account.

Parameters
parentThe parent account to check.
childThe child account to find.
Returns
The index of the child account within the specified parent, or -1.

Definition at line 2959 of file Account.cpp.

2960 {
2961  g_return_val_if_fail(GNC_IS_ACCOUNT(parent), -1);
2962  g_return_val_if_fail(GNC_IS_ACCOUNT(child), -1);
2963  return g_list_index(GET_PRIVATE(parent)->children, child);
2964 }

◆ gnc_account_create_root()

Account* gnc_account_create_root ( QofBook *  book)

Create a new root level account.

Definition at line 1242 of file Account.cpp.

1243 {
1244  Account *root;
1245  AccountPrivate *rpriv;
1246 
1247  root = xaccMallocAccount(book);
1248  rpriv = GET_PRIVATE(root);
1249  xaccAccountBeginEdit(root);
1250  rpriv->type = ACCT_TYPE_ROOT;
1251  rpriv->accountName = qof_string_cache_replace(rpriv->accountName, "Root Account");
1252  mark_account (root);
1253  xaccAccountCommitEdit(root);
1254  gnc_book_set_root_account(book, root);
1255  return root;
1256 }
const char * qof_string_cache_replace(char const *dst, char const *src)
Same as CACHE_REPLACE below, but safe to call from C++.
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
Definition: Account.cpp:1449
Account * xaccMallocAccount(QofBook *book)
Constructor.
Definition: Account.cpp:1228
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
Definition: Account.cpp:1490
The hidden root account of an account tree.
Definition: Account.h:156

◆ gnc_account_foreach_child()

void gnc_account_foreach_child ( const Account account,
AccountCb  func,
gpointer  user_data 
)

This method will traverse the immediate children of this accounts, calling 'func' on each account.

This function traverses all children nodes. To traverse only a subset of the child nodes use the gnc_account_foreach_child_until() function.

Parameters
accountA pointer to the account on whose children the function should be called.
funcA function taking two arguments, an Account and a gpointer.
user_dataThis data will be passed to each call of func.

Definition at line 3227 of file Account.cpp.

3230 {
3231  const AccountPrivate *priv;
3232  GList *node;
3233 
3234  g_return_if_fail(GNC_IS_ACCOUNT(acc));
3235  g_return_if_fail(thunk);
3236 
3237  priv = GET_PRIVATE(acc);
3238  for (node = priv->children; node; node = node->next)
3239  {
3240  thunk (static_cast<Account*>(node->data), user_data);
3241  }
3242 }

◆ gnc_account_foreach_descendant()

void gnc_account_foreach_descendant ( const Account account,
AccountCb  func,
gpointer  user_data 
)

This method will traverse all children of this accounts and their descendants, calling 'func' on each account.

This function traverses all descendant nodes. To traverse only a subset of the descendant nodes use the gnc_account_foreach_descendant_until() function.

Parameters
accountA pointer to the account on whose descendants the function should be called.
funcA function taking two arguments, an Account and a gpointer.
user_dataThis data will be passed to each call of func.

Definition at line 3245 of file Account.cpp.

3248 {
3249  account_foreach_descendant (acc, thunk, user_data, FALSE);
3250 }

◆ gnc_account_foreach_descendant_until()

gpointer gnc_account_foreach_descendant_until ( const Account account,
AccountCb2  func,
gpointer  user_data 
)

This method will traverse all children of this accounts and their descendants, calling 'func' on each account.

Traversal will stop when func returns a non-null value, and the routine will return with that value. Therefore, this function will return null if func returns null for every account. For a simpler function that always traverses all children nodes, use the gnc_account_foreach_descendant() function.

Parameters
accountA pointer to the account on whose descendants the function should be called.
funcA function taking two arguments, an Account and a gpointer.
user_dataThis data will be passed to each call of func.

Definition at line 3253 of file Account.cpp.

3256 {
3257  gpointer result {nullptr};
3258 
3259  g_return_val_if_fail (GNC_IS_ACCOUNT(acc), nullptr);
3260  g_return_val_if_fail (thunk, nullptr);
3261 
3262  auto priv{GET_PRIVATE(acc)};
3263 
3264  for (auto node = priv->children; node; node = node->next)
3265  {
3266  auto child = static_cast<Account*>(node->data);
3267  result = thunk (child, user_data);
3268  if (result) break;
3269 
3270  result = gnc_account_foreach_descendant_until (child, thunk, user_data);
3271  if (result) break;
3272  }
3273 
3274  return result;
3275 }
gpointer gnc_account_foreach_descendant_until(const Account *acc, AccountCb2 thunk, gpointer user_data)
This method will traverse all children of this accounts and their descendants, calling &#39;func&#39; on each...
Definition: Account.cpp:3253

◆ gnc_account_get_children()

GList* gnc_account_get_children ( const Account account)

This routine returns a GList of all children accounts of the specified account.

This function only returns the immediate children of the specified account. For a list of all descendant accounts, use the gnc_account_get_descendants() function.

If you are looking for the splits of this account, use xaccAccountGetSplitList() instead. This function here deals with children accounts inside the account tree.

Parameters
accountThe account whose children should be returned.
Returns
A GList of account pointers, or NULL if there are no children accounts. It is the callers responsibility to free any returned list with the g_list_free() function.

Definition at line 2930 of file Account.cpp.

2931 {
2932  g_return_val_if_fail(GNC_IS_ACCOUNT(account), NULL);
2933  return g_list_copy(GET_PRIVATE(account)->children);
2934 }

◆ gnc_account_get_children_sorted()

GList* gnc_account_get_children_sorted ( const Account account)

This routine returns a GList of all children accounts of the specified account, ordered by xaccAccountOrder().

See also
gnc_account_get_children()

Definition at line 2937 of file Account.cpp.

2938 {
2939  AccountPrivate *priv;
2940 
2941  /* errors */
2942  g_return_val_if_fail(GNC_IS_ACCOUNT(account), NULL);
2943 
2944  /* optimizations */
2945  priv = GET_PRIVATE(account);
2946  if (!priv->children)
2947  return NULL;
2948  return g_list_sort(g_list_copy(priv->children), (GCompareFunc)xaccAccountOrder);
2949 }
int xaccAccountOrder(const Account *aa, const Account *ab)
The xaccAccountOrder() subroutine defines a sorting order on accounts.
Definition: Account.cpp:2362

◆ gnc_account_get_currency_or_parent()

gnc_commodity* gnc_account_get_currency_or_parent ( const Account account)

Returns a gnc_commodity that is a currency, suitable for being a Transaction's currency.

The gnc_commodity is taken either from the current account, or from the next parent account that has a gnc_commodity that is a currency. If neither this account nor any of its parent has such a commodity that is a currency, NULL is returned. In that case, you can use gnc_default_currency() but you might want to show a warning dialog first.

Definition at line 3455 of file Account.cpp.

3456 {
3457  gnc_commodity * commodity;
3458  g_return_val_if_fail (account, NULL);
3459 
3460  commodity = xaccAccountGetCommodity (account);
3461  if (gnc_commodity_is_currency(commodity))
3462  return commodity;
3463  else
3464  {
3465  const Account *parent_account = account;
3466  /* Account commodity is not a currency, walk up the tree until
3467  * we find a parent account that is a currency account and use
3468  * it's currency.
3469  */
3470  do
3471  {
3472  parent_account = gnc_account_get_parent (parent_account);
3473  if (parent_account)
3474  {
3475  commodity = xaccAccountGetCommodity (parent_account);
3476  if (gnc_commodity_is_currency(commodity))
3477  {
3478  return commodity;
3479  //break;
3480  }
3481  }
3482  }
3483  while (parent_account);
3484  }
3485  return NULL; // no suitable commodity found.
3486 }
Account * gnc_account_get_parent(const Account *acc)
This routine returns a pointer to the parent of the specified account.
Definition: Account.cpp:2899
gboolean gnc_commodity_is_currency(const gnc_commodity *cm)
Checks to see if the specified commodity is an ISO 4217 recognized currency or a legacy currency...
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account&#39;s commodity.
Definition: Account.cpp:3448

◆ gnc_account_get_current_depth()

gint gnc_account_get_current_depth ( const Account account)

Return the number of levels of this account below the root account.

Parameters
accountThe account to query.
Returns
The number of levels below the root.

Definition at line 2989 of file Account.cpp.

2990 {
2991  AccountPrivate *priv;
2992  int depth = 0;
2993 
2994  g_return_val_if_fail(GNC_IS_ACCOUNT(account), 0);
2995 
2996  priv = GET_PRIVATE(account);
2997  while (priv->parent && (priv->type != ACCT_TYPE_ROOT))
2998  {
2999  account = priv->parent;
3000  priv = GET_PRIVATE(account);
3001  depth++;
3002  }
3003 
3004  return depth;
3005 }
The hidden root account of an account tree.
Definition: Account.h:156

◆ gnc_account_get_descendants()

GList* gnc_account_get_descendants ( const Account account)

This routine returns a flat list of all of the accounts that are descendants of the specified account.

This includes not only the the children, but the children of the children, etc. For a list of only the immediate child accounts, use the gnc_account_get_children() function. Within each set of child accounts, the accounts returned by this function are unordered. For a list of descendants where each set of children is sorted via the standard account sort function, use the gnc_account_get_descendants_sorted() function.

Parameters
accountThe account whose descendants should be returned.
Returns
A GList of account pointers, or NULL if there are no descendants. It is the callers responsibility to free any returned list with the g_list_free() function.

Definition at line 3036 of file Account.cpp.

3037 {
3038  GList* list = nullptr;
3039  account_foreach_descendant (account, collect_acct, &list, FALSE);
3040  return g_list_reverse (list);
3041 }

◆ gnc_account_get_descendants_sorted()

GList* gnc_account_get_descendants_sorted ( const Account account)

This function returns a GList containing all the descendants of the specified account, sorted at each level.

This includes not only the the children, but the children of the children, etc. Within each set of child accounts, the accounts returned by this function are ordered via the standard account sort function. For a list of descendants where each set of children is unordered, use the gnc_account_get_descendants() function.

Note: Use this function where the results are intended for display to the user. If the results are internal to GnuCash or will be resorted at some later point in time you should use the gnc_account_get_descendants() function.

Parameters
accountThe account whose descendants should be returned.
Returns
A GList of account pointers, or NULL if there are no descendants. It is the callers responsibility to free any returned list with the g_list_free() function.

Definition at line 3044 of file Account.cpp.

3045 {
3046  GList* list = nullptr;
3047  account_foreach_descendant (account, collect_acct, &list, TRUE);
3048  return g_list_reverse (list);
3049 }

◆ gnc_account_get_full_name()

gchar* gnc_account_get_full_name ( const Account account)

The gnc_account_get_full_name routine returns the fully qualified name of the account using the given separator char.

The name must be g_free'd after use. The fully qualified name of an account is the concatenation of the names of the account and all its ancestor accounts starting with the topmost account and ending with the given account. Each name is separated by the given character.

Note
: WAKE UP! Unlike all other gets, the string returned by gnc_account_get_full_name() must be freed by you the user !!! hack alert – since it breaks the rule of string allocation, maybe this routine should not be in this library, but some utility library?

Definition at line 3308 of file Account.cpp.

3309 {
3310  AccountPrivate *priv;
3311  const Account *a;
3312  char *fullname;
3313  const gchar **names;
3314  int level;
3315 
3316  /* So much for hardening the API. Too many callers to this function don't
3317  * bother to check if they have a non-NULL pointer before calling. */
3318  if (NULL == account)
3319  return g_strdup("");
3320 
3321  /* errors */
3322  g_return_val_if_fail(GNC_IS_ACCOUNT(account), g_strdup(""));
3323 
3324  /* optimizations */
3325  priv = GET_PRIVATE(account);
3326  if (!priv->parent)
3327  return g_strdup("");
3328 
3329  /* Figure out how much space is needed by counting the nodes up to
3330  * the root. */
3331  level = 0;
3332  for (a = account; a; a = priv->parent)
3333  {
3334  priv = GET_PRIVATE(a);
3335  level++;
3336  }
3337 
3338  /* Get all the pointers in the right order. The root node "entry"
3339  * becomes the terminating NULL pointer for the array of strings. */
3340  names = (const gchar **)g_malloc(level * sizeof(gchar *));
3341  names[--level] = NULL;
3342  for (a = account; level > 0; a = priv->parent)
3343  {
3344  priv = GET_PRIVATE(a);
3345  names[--level] = priv->accountName;
3346  }
3347 
3348  /* Build the full name */
3349  fullname = g_strjoinv(account_separator, (gchar **)names);
3350  g_free(names);
3351 
3352  return fullname;
3353 }

◆ gnc_account_get_parent()

Account* gnc_account_get_parent ( const Account account)

This routine returns a pointer to the parent of the specified account.

If the account has no parent, i.e it is either the root node or is a disconnected account, then its parent will be NULL.

Parameters
accountA pointer to any exiting account.
Returns
A pointer to the parent account node, or NULL if there is no parent account.

Definition at line 2899 of file Account.cpp.

2900 {
2901  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), NULL);
2902  return GET_PRIVATE(acc)->parent;
2903 }

◆ gnc_account_get_root()

Account* gnc_account_get_root ( Account account)

This routine returns the root account of the account tree that the specified account belongs to.

It is the equivalent of repeatedly calling the gnc_account_get_parent() routine until that routine returns NULL.

Parameters
accountA pointer to any existing account.
Returns
The root node of the account tree to which this account belongs. NULL if the account is not part of any account tree.

Definition at line 2906 of file Account.cpp.

2907 {
2908  AccountPrivate *priv;
2909 
2910  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), NULL);
2911 
2912  priv = GET_PRIVATE(acc);
2913  while (priv->parent)
2914  {
2915  acc = priv->parent;
2916  priv = GET_PRIVATE(acc);
2917  }
2918 
2919  return acc;
2920 }

◆ gnc_account_get_tree_depth()

gint gnc_account_get_tree_depth ( const Account account)

Return the number of levels of descendants accounts below the specified account.

The returned number does not include the specified account itself.

Parameters
accountThe account to query.
Returns
The number of levels of descendants.

Definition at line 3008 of file Account.cpp.

3009 {
3010  AccountPrivate *priv;
3011  GList *node;
3012  gint depth = 0, child_depth;
3013 
3014  g_return_val_if_fail(GNC_IS_ACCOUNT(account), 0);
3015 
3016  priv = GET_PRIVATE(account);
3017  if (!priv->children)
3018  return 1;
3019 
3020  for (node = priv->children; node; node = g_list_next(node))
3021  {
3022  child_depth = gnc_account_get_tree_depth(static_cast<Account const *>(node->data));
3023  depth = MAX(depth, child_depth);
3024  }
3025  return depth + 1;
3026 }
gint gnc_account_get_tree_depth(const Account *account)
Return the number of levels of descendants accounts below the specified account.
Definition: Account.cpp:3008

◆ gnc_account_get_type()

GType gnc_account_get_type ( void  )

Returns the GType type system description of the Account class.

This must not be confused with the GNCAccountType as returned by xaccAccountGetType().

Definition at line 27 of file gmock-Account.cpp.

28 {
29  return gnc_mockaccount_get_type();
30 }

◆ gnc_account_insert_split()

gboolean gnc_account_insert_split ( Account acc,
Split *  s 
)

Insert the given split from an account.

Parameters
accThe account to which the split should be added.
sThe split to be added.
Returns
TRUE is the split is successfully added to the set of splits in the account. FALSE if the addition fails for any reason (including that the split is already in the account).

Definition at line 1943 of file Account.cpp.

1944 {
1945  AccountPrivate *priv;
1946  GList *node;
1947 
1948  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), FALSE);
1949  g_return_val_if_fail(GNC_IS_SPLIT(s), FALSE);
1950 
1951  priv = GET_PRIVATE(acc);
1952  node = g_list_find(priv->splits, s);
1953  if (node)
1954  return FALSE;
1955 
1956  if (qof_instance_get_editlevel(acc) == 0)
1957  {
1958  priv->splits = g_list_insert_sorted(priv->splits, s,
1959  (GCompareFunc)xaccSplitOrder);
1960  }
1961  else
1962  {
1963  priv->splits = g_list_prepend(priv->splits, s);
1964  priv->sort_dirty = TRUE;
1965  }
1966 
1967  //FIXME: find better event
1968  qof_event_gen (&acc->inst, QOF_EVENT_MODIFY, NULL);
1969  /* Also send an event based on the account */
1970  qof_event_gen(&acc->inst, GNC_EVENT_ITEM_ADDED, s);
1971 
1972  priv->balance_dirty = TRUE;
1973 // DRH: Should the below be added? It is present in the delete path.
1974 // xaccAccountRecomputeBalance(acc);
1975  return TRUE;
1976 }
gint xaccSplitOrder(const Split *sa, const Split *sb)
The xaccSplitOrder(sa,sb) method is useful for sorting.
Definition: Split.c:1504
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
Definition: qofevent.cpp:231
#define GNC_EVENT_ITEM_ADDED
These events are used when a split is added to an account.
Definition: gnc-event.h:45

◆ gnc_account_is_root()

gboolean gnc_account_is_root ( const Account account)

This routine indicates whether the specified account is the root node of an account tree.

Parameters
accountA pointer to any account.
Returns
TRUE if this account is of type ROOT. FALSE otherwise.

Definition at line 2923 of file Account.cpp.

2924 {
2925  g_return_val_if_fail(GNC_IS_ACCOUNT(account), FALSE);
2926  return (GET_PRIVATE(account)->parent == NULL);
2927 }

◆ gnc_account_join_children()

void gnc_account_join_children ( Account to_parent,
Account from_parent 
)

The gnc_account_join_children() subroutine will move (reparent) all child accounts from the from_parent account to the to_parent account, preserving the account hierarchy.

It will also take care that the moved accounts will have the to_parent's book parent as well.

Definition at line 5201 of file Account.cpp.

5202 {
5203  AccountPrivate *from_priv;
5204  GList *children, *node;
5205 
5206  /* errors */
5207  g_return_if_fail(GNC_IS_ACCOUNT(to_parent));
5208  g_return_if_fail(GNC_IS_ACCOUNT(from_parent));
5209 
5210  /* optimizations */
5211  from_priv = GET_PRIVATE(from_parent);
5212  if (!from_priv->children)
5213  return;
5214 
5215  ENTER (" ");
5216  children = g_list_copy(from_priv->children);
5217  for (node = children; node; node = g_list_next(node))
5218  gnc_account_append_child(to_parent, static_cast <Account*> (node->data));
5219  g_list_free(children);
5220  LEAVE (" ");
5221 }
void gnc_account_append_child(Account *new_parent, Account *child)
This function will remove from the child account any pre-existing parent relationship, and will then add the account as a child of the new parent.
Definition: Account.cpp:2801
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282

◆ gnc_account_list_name_violations()

GList* gnc_account_list_name_violations ( QofBook *  book,
const gchar *  separator 
)

Runs through all the accounts and returns a list of account names that contain the provided separator character.

This can be used to check if certain account names are invalid.

Parameters
bookPointer to the book with accounts to verify
separatorThe separator character to verify against
Returns
A GList of invalid account names. Should be freed with g_list_free_full (value, g_free) when no longer needed.

Definition at line 269 of file Account.cpp.

270 {
271  g_return_val_if_fail (separator != NULL, nullptr);
272  if (!book) return nullptr;
273  ViolationData cb = { nullptr, separator };
274  gnc_account_foreach_descendant (gnc_book_get_root_account (book),
275  (AccountCb)check_acct_name, &cb);
276  return cb.list;
277 }
void gnc_account_foreach_descendant(const Account *acc, AccountCb thunk, gpointer user_data)
This method will traverse all children of this accounts and their descendants, calling &#39;func&#39; on each...
Definition: Account.cpp:3245

◆ gnc_account_merge_children()

void gnc_account_merge_children ( Account parent)

The gnc_account_merge_children() subroutine will go through an account, merging all child accounts that have the same name and description.

This function is useful when importing Quicken(TM) files.

Definition at line 5226 of file Account.cpp.

5227 {
5228  AccountPrivate *ppriv, *priv_a, *priv_b;
5229  GList *node_a, *node_b, *work, *worker;
5230 
5231  g_return_if_fail(GNC_IS_ACCOUNT(parent));
5232 
5233  ppriv = GET_PRIVATE(parent);
5234  for (node_a = ppriv->children; node_a; node_a = node_a->next)
5235  {
5236  Account *acc_a = static_cast <Account*> (node_a->data);
5237 
5238  priv_a = GET_PRIVATE(acc_a);
5239  for (node_b = node_a->next; node_b; node_b = g_list_next(node_b))
5240  {
5241  Account *acc_b = static_cast <Account*> (node_b->data);
5242 
5243  priv_b = GET_PRIVATE(acc_b);
5244  if (0 != null_strcmp(priv_a->accountName, priv_b->accountName))
5245  continue;
5246  if (0 != null_strcmp(priv_a->accountCode, priv_b->accountCode))
5247  continue;
5248  if (0 != null_strcmp(priv_a->description, priv_b->description))
5249  continue;
5250  if (0 != null_strcmp(xaccAccountGetColor(acc_a),
5251  xaccAccountGetColor(acc_b)))
5252  continue;
5253  if (!gnc_commodity_equiv(priv_a->commodity, priv_b->commodity))
5254  continue;
5255  if (0 != null_strcmp(xaccAccountGetNotes(acc_a),
5256  xaccAccountGetNotes(acc_b)))
5257  continue;
5258  if (priv_a->type != priv_b->type)
5259  continue;
5260 
5261  /* consolidate children */
5262  if (priv_b->children)
5263  {
5264  work = g_list_copy(priv_b->children);
5265  for (worker = work; worker; worker = g_list_next(worker))
5266  gnc_account_append_child (acc_a, (Account *)worker->data);
5267  g_list_free(work);
5268 
5269  qof_event_gen (&acc_a->inst, QOF_EVENT_MODIFY, NULL);
5270  qof_event_gen (&acc_b->inst, QOF_EVENT_MODIFY, NULL);
5271  }
5272 
5273  /* recurse to do the children's children */
5275 
5276  /* consolidate transactions */
5277  while (priv_b->splits)
5278  xaccSplitSetAccount (static_cast <Split*> (priv_b->splits->data), acc_a);
5279 
5280  /* move back one before removal. next iteration around the loop
5281  * will get the node after node_b */
5282  node_b = g_list_previous(node_b);
5283 
5284  /* The destroy function will remove from list -- node_a is ok,
5285  * it's before node_b */
5286  xaccAccountBeginEdit (acc_b);
5287  xaccAccountDestroy (acc_b);
5288  }
5289  }
5290 }
void gnc_account_append_child(Account *new_parent, Account *child)
This function will remove from the child account any pre-existing parent relationship, and will then add the account as a child of the new parent.
Definition: Account.cpp:2801
void xaccAccountDestroy(Account *acc)
The xaccAccountDestroy() routine can be used to get rid of an account.
Definition: Account.cpp:1569
const char * xaccAccountGetColor(const Account *acc)
Get the account&#39;s color.
Definition: Account.cpp:3370
gint null_strcmp(const gchar *da, const gchar *db)
The null_strcmp compares strings a and b the same way that strcmp() does, except that either may be n...
Definition: qofutil.cpp:123
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
Definition: Account.cpp:1449
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
Definition: qofevent.cpp:231
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equivalent.
void gnc_account_merge_children(Account *parent)
The gnc_account_merge_children() subroutine will go through an account, merging all child accounts th...
Definition: Account.cpp:5226
const char * xaccAccountGetNotes(const Account *acc)
Get the account&#39;s notes.
Definition: Account.cpp:3416

◆ gnc_account_n_children()

gint gnc_account_n_children ( const Account account)

Return the number of children of the specified account.

The returned number does not include the account itself.

Parameters
accountThe account to query.
Returns
The number of children of the specified account.

Definition at line 2952 of file Account.cpp.

2953 {
2954  g_return_val_if_fail(GNC_IS_ACCOUNT(account), 0);
2955  return g_list_length(GET_PRIVATE(account)->children);
2956 }

◆ gnc_account_n_descendants()

gint gnc_account_n_descendants ( const Account account)

Return the number of descendants of the specified account.

The returned number does not include the account itself.

Parameters
accountThe account to query.
Returns
The number of descendants of the specified account.

Definition at line 2981 of file Account.cpp.

2982 {
2983  int count {0};
2984  account_foreach_descendant (account, count_acct, &count, FALSE);
2985  return count;
2986 }

◆ gnc_account_name_violations_errmsg()

gchar* gnc_account_name_violations_errmsg ( const gchar *  separator,
GList *  invalid_account_names 
)

Composes a translatable error message showing which account names clash with the current account separator.

Can be called after gnc_account_list_name_violations to have a consistent error message in different parts of GnuCash

Parameters
separatorThe separator character that was verified against
invalid_account_namesA GList of invalid account names.
Returns
An error message that can be displayed to the user or logged. This message string should be freed with g_free when no longer needed.

Definition at line 231 of file Account.cpp.

232 {
233  gchar *message = NULL;
234 
235  if ( !invalid_account_names )
236  return NULL;
237 
238  auto account_list {gnc_g_list_stringjoin (invalid_account_names, "\n")};
239 
240  /* Translators: The first %s will be the account separator character,
241  the second %s is a list of account names.
242  The resulting string will be displayed to the user if there are
243  account names containing the separator character. */
244  message = g_strdup_printf(
245  _("The separator character \"%s\" is used in one or more account names.\n\n"
246  "This will result in unexpected behaviour. "
247  "Either change the account names or choose another separator character.\n\n"
248  "Below you will find the list of invalid account names:\n"
249  "%s"), separator, account_list );
250  g_free ( account_list );
251  return message;
252 }
gchar * gnc_g_list_stringjoin(GList *list_of_strings, const gchar *sep)
Return a string joining a GList whose elements are gchar* strings.

◆ gnc_account_nth_child()

Account* gnc_account_nth_child ( const Account parent,
gint  num 
)

Return the n'th child account of the specified parent account.

If the parent account is not specified or the child index number is invalid, this function returns NULL.

Parameters
parentThe parent account to check.
numThe index number of the child account that should be returned.
Returns
A pointer to the specified child account, or NULL

Definition at line 2967 of file Account.cpp.

2968 {
2969  g_return_val_if_fail(GNC_IS_ACCOUNT(parent), NULL);
2970  return static_cast<Account*>(g_list_nth_data(GET_PRIVATE(parent)->children, num));
2971 }

◆ gnc_account_remove_child()

void gnc_account_remove_child ( Account parent,
Account child 
)

This function will remove the specified child account from the specified parent account.

It will NOT free the associated memory or otherwise alter the account: the account can now be reparented to a new location. Note, however, that it will mark the old parents as having been modified.

Parameters
parentThe parent account from which the child should be removed.
childThe child account to remove.

Definition at line 2863 of file Account.cpp.

2864 {
2865  AccountPrivate *ppriv, *cpriv;
2866  GncEventData ed;
2867 
2868  if (!child) return;
2869 
2870  /* Note this routine might be called on accounts which
2871  * are not yet parented. */
2872  if (!parent) return;
2873 
2874  ppriv = GET_PRIVATE(parent);
2875  cpriv = GET_PRIVATE(child);
2876 
2877  if (cpriv->parent != parent)
2878  {
2879  PERR ("account not a child of parent");
2880  return;
2881  }
2882 
2883  /* Gather event data */
2884  ed.node = parent;
2885  ed.idx = g_list_index(ppriv->children, child);
2886 
2887  ppriv->children = g_list_remove(ppriv->children, child);
2888 
2889  /* Now send the event. */
2890  qof_event_gen(&child->inst, QOF_EVENT_REMOVE, &ed);
2891 
2892  /* clear the account's parent pointer after REMOVE event generation. */
2893  cpriv->parent = NULL;
2894 
2895  qof_event_gen (&parent->inst, QOF_EVENT_MODIFY, NULL);
2896 }
#define PERR(format, args...)
Log a serious error.
Definition: qoflog.h:244
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
Definition: qofevent.cpp:231

◆ gnc_account_remove_split()

gboolean gnc_account_remove_split ( Account acc,
Split *  s 
)

Remove the given split from an account.

Parameters
accThe account from which the split should be removed.
sThe split to be removed.
Returns
TRUE is the split is successfully removed from the set of splits in the account. FALSE if the removal fails for any reason.

Definition at line 1979 of file Account.cpp.

1980 {
1981  AccountPrivate *priv;
1982  GList *node;
1983 
1984  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), FALSE);
1985  g_return_val_if_fail(GNC_IS_SPLIT(s), FALSE);
1986 
1987  priv = GET_PRIVATE(acc);
1988  node = g_list_find(priv->splits, s);
1989  if (NULL == node)
1990  return FALSE;
1991 
1992  priv->splits = g_list_delete_link(priv->splits, node);
1993  //FIXME: find better event type
1994  qof_event_gen(&acc->inst, QOF_EVENT_MODIFY, NULL);
1995  // And send the account-based event, too
1996  qof_event_gen(&acc->inst, GNC_EVENT_ITEM_REMOVED, s);
1997 
1998  priv->balance_dirty = TRUE;
2000  return TRUE;
2001 }
void xaccAccountRecomputeBalance(Account *acc)
The following recompute the partial balances (stored with the transaction) and the total balance...
Definition: Account.cpp:2281
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
Definition: qofevent.cpp:231

◆ gnc_account_set_balance_dirty()

void gnc_account_set_balance_dirty ( Account acc)

Tell the account that the running balances may be incorrect and need to be recomputed.

Parameters
accSet the flag on this account.

Definition at line 1903 of file Account.cpp.

1904 {
1905  AccountPrivate *priv;
1906 
1907  g_return_if_fail(GNC_IS_ACCOUNT(acc));
1908 
1909  if (qof_instance_get_destroying(acc))
1910  return;
1911 
1912  priv = GET_PRIVATE(acc);
1913  priv->balance_dirty = TRUE;
1914 }
gboolean qof_instance_get_destroying(gconstpointer ptr)
Retrieve the flag that indicates whether or not this object is about to be destroyed.

◆ gnc_account_set_defer_bal_computation()

void gnc_account_set_defer_bal_computation ( Account acc,
gboolean  defer 
)

Set the defer balance flag.

If defer is true, the account balance is not automatically computed, which can save a lot of time if multiple operations have to be done on the same account. If defer is false, further operations on account will cause the balance to be recomputed as normal.

Parameters
accSet the flag on this account.
deferNew value for the flag.

Definition at line 1916 of file Account.cpp.

1917 {
1918  AccountPrivate *priv;
1919 
1920  g_return_if_fail (GNC_IS_ACCOUNT (acc));
1921 
1922  if (qof_instance_get_destroying (acc))
1923  return;
1924 
1925  priv = GET_PRIVATE (acc);
1926  priv->defer_bal_computation = defer;
1927 }
gboolean qof_instance_get_destroying(gconstpointer ptr)
Retrieve the flag that indicates whether or not this object is about to be destroyed.

◆ gnc_account_set_sort_dirty()

void gnc_account_set_sort_dirty ( Account acc)

Tell the account believes that the splits may be incorrectly sorted and need to be resorted.

Parameters
accSet the flag on this account.

Definition at line 1889 of file Account.cpp.

1890 {
1891  AccountPrivate *priv;
1892 
1893  g_return_if_fail(GNC_IS_ACCOUNT(acc));
1894 
1895  if (qof_instance_get_destroying(acc))
1896  return;
1897 
1898  priv = GET_PRIVATE(acc);
1899  priv->sort_dirty = TRUE;
1900 }
gboolean qof_instance_get_destroying(gconstpointer ptr)
Retrieve the flag that indicates whether or not this object is about to be destroyed.

◆ gnc_account_set_start_balance()

void gnc_account_set_start_balance ( Account acc,
const gnc_numeric  start_baln 
)

This function will set the starting commodity balance for this account.

This routine is intended for use with backends that do not return the complete list of splits for an account, but rather return a partial list. In such a case, the backend will typically return all of the splits after some certain date, and the 'starting balance' will represent the summation of the splits up to that date.

Definition at line 3491 of file Account.cpp.

3492 {
3493  AccountPrivate *priv;
3494 
3495  g_return_if_fail(GNC_IS_ACCOUNT(acc));
3496 
3497  priv = GET_PRIVATE(acc);
3498  priv->starting_balance = start_baln;
3499  priv->balance_dirty = TRUE;
3500 }

◆ gnc_account_set_start_cleared_balance()

void gnc_account_set_start_cleared_balance ( Account acc,
const gnc_numeric  start_baln 
)

This function will set the starting cleared commodity balance for this account.

This routine is intended for use with backends that do not return the complete list of splits for an account, but rather return a partial list. In such a case, the backend will typically return all of the splits after some certain date, and the 'starting balance' will represent the summation of the splits up to that date.

Definition at line 3503 of file Account.cpp.

3505 {
3506  AccountPrivate *priv;
3507 
3508  g_return_if_fail(GNC_IS_ACCOUNT(acc));
3509 
3510  priv = GET_PRIVATE(acc);
3511  priv->starting_cleared_balance = start_baln;
3512  priv->balance_dirty = TRUE;
3513 }

◆ gnc_account_set_start_reconciled_balance()

void gnc_account_set_start_reconciled_balance ( Account acc,
const gnc_numeric  start_baln 
)

This function will set the starting reconciled commodity balance for this account.

This routine is intended for use with backends that do not return the complete list of splits for an account, but rather return a partial list. In such a case, the backend will typically return all of the splits after some certain date, and the 'starting balance' will represent the summation of the splits up to that date.

Definition at line 3516 of file Account.cpp.

3518 {
3519  AccountPrivate *priv;
3520 
3521  g_return_if_fail(GNC_IS_ACCOUNT(acc));
3522 
3523  priv = GET_PRIVATE(acc);
3524  priv->starting_reconciled_balance = start_baln;
3525  priv->balance_dirty = TRUE;
3526 }

◆ gnc_get_account_separator_string()

const gchar* gnc_get_account_separator_string ( void  )

Returns the account separation character chosen by the user.

Returns
The character to use.

Definition at line 201 of file Account.cpp.

202 {
203  return account_separator;
204 }

◆ xaccAccountBeginEdit()

void xaccAccountBeginEdit ( Account account)

The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account updates.

Definition at line 1449 of file Account.cpp.

1450 {
1451  g_return_if_fail(acc);
1452  qof_begin_edit(&acc->inst);
1453 }
gboolean qof_begin_edit(QofInstance *inst)
begin_edit

◆ xaccAccountCommitEdit()

void xaccAccountCommitEdit ( Account account)

ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account updates.

Definition at line 1490 of file Account.cpp.

1491 {
1492  AccountPrivate *priv;
1493  QofBook *book;
1494 
1495  g_return_if_fail(acc);
1496  if (!qof_commit_edit(&acc->inst)) return;
1497 
1498  /* If marked for deletion, get rid of subaccounts first,
1499  * and then the splits ... */
1500  priv = GET_PRIVATE(acc);
1501  if (qof_instance_get_destroying(acc))
1502  {
1503  GList *lp, *slist;
1504  QofCollection *col;
1505 
1506  qof_instance_increase_editlevel(acc);
1507 
1508  /* First, recursively free children */
1509  xaccFreeAccountChildren(acc);
1510 
1511  PINFO ("freeing splits for account %p (%s)",
1512  acc, priv->accountName ? priv->accountName : "(null)");
1513 
1514  book = qof_instance_get_book(acc);
1515 
1516  /* If book is shutting down, just clear the split list. The splits
1517  themselves will be destroyed by the transaction code */
1518  if (!qof_book_shutting_down(book))
1519  {
1520  slist = g_list_copy(priv->splits);
1521  for (lp = slist; lp; lp = lp->next)
1522  {
1523  Split *s = static_cast<Split *>(lp->data);
1524  xaccSplitDestroy (s);
1525  }
1526  g_list_free(slist);
1527  }
1528  else
1529  {
1530  g_list_free(priv->splits);
1531  priv->splits = NULL;
1532  }
1533 
1534  /* It turns out there's a case where this assertion does not hold:
1535  When the user tries to delete an Imbalance account, while also
1536  deleting all the splits in it. The splits will just get
1537  recreated and put right back into the same account!
1538 
1539  g_assert(priv->splits == NULL || qof_book_shutting_down(acc->inst.book));
1540  */
1541 
1542  if (!qof_book_shutting_down(book))
1543  {
1544  col = qof_book_get_collection(book, GNC_ID_TRANS);
1545  qof_collection_foreach(col, destroy_pending_splits_for_account, acc);
1546 
1547  /* the lots should be empty by now */
1548  for (lp = priv->lots; lp; lp = lp->next)
1549  {
1550  GNCLot *lot = static_cast<GNCLot*>(lp->data);
1551  gnc_lot_destroy (lot);
1552  }
1553  }
1554  g_list_free(priv->lots);
1555  priv->lots = NULL;
1556 
1557  qof_instance_set_dirty(&acc->inst);
1558  qof_instance_decrease_editlevel(acc);
1559  }
1560  else
1561  {
1562  xaccAccountBringUpToDate(acc);
1563  }
1564 
1565  qof_commit_edit_part2(&acc->inst, on_err, on_done, acc_free);
1566 }
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
#define PINFO(format, args...)
Print an informational note.
Definition: qoflog.h:256
gboolean xaccSplitDestroy(Split *split)
Destructor.
Definition: Split.c:1474
gboolean qof_instance_get_destroying(gconstpointer ptr)
Retrieve the flag that indicates whether or not this object is about to be destroyed.
gboolean qof_commit_edit(QofInstance *inst)
commit_edit helpers
void qof_collection_foreach(const QofCollection *col, QofInstanceForeachCB cb_func, gpointer user_data)
Call the callback for each entity in the collection.
Definition: qofid.cpp:323
gboolean qof_commit_edit_part2(QofInstance *inst, void(*on_error)(QofInstance *, QofBackendError), void(*on_done)(QofInstance *), void(*on_free)(QofInstance *))
part2 – deal with the backend
QofCollection * qof_book_get_collection(const QofBook *book, QofIdType entity_type)
Return The table of entities of the given type.
Definition: qofbook.cpp:604
gboolean qof_book_shutting_down(const QofBook *book)
Is the book shutting down?
Definition: qofbook.cpp:531

◆ xaccAccountDestroy()

void xaccAccountDestroy ( Account account)

The xaccAccountDestroy() routine can be used to get rid of an account.

The account should have been opened for editing (by calling xaccAccountBeginEdit()) before calling this routine.

Definition at line 1569 of file Account.cpp.

1570 {
1571  g_return_if_fail(GNC_IS_ACCOUNT(acc));
1572 
1573  qof_instance_set_destroying(acc, TRUE);
1574 
1575  xaccAccountCommitEdit (acc);
1576 }
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
Definition: Account.cpp:1490

◆ xaccAccountEqual()

gboolean xaccAccountEqual ( const Account a,
const Account b,
gboolean  check_guids 
)

Compare two accounts for equality - this is a deep compare.

Definition at line 1644 of file Account.cpp.

1645 {
1646  AccountPrivate *priv_aa, *priv_ab;
1647 
1648  if (!aa && !ab) return TRUE;
1649 
1650  g_return_val_if_fail(GNC_IS_ACCOUNT(aa), FALSE);
1651  g_return_val_if_fail(GNC_IS_ACCOUNT(ab), FALSE);
1652 
1653  priv_aa = GET_PRIVATE(aa);
1654  priv_ab = GET_PRIVATE(ab);
1655  if (priv_aa->type != priv_ab->type)
1656  {
1657  PWARN ("types differ: %d vs %d", priv_aa->type, priv_ab->type);
1658  return FALSE;
1659  }
1660 
1661  if (g_strcmp0(priv_aa->accountName, priv_ab->accountName) != 0)
1662  {
1663  PWARN ("names differ: %s vs %s", priv_aa->accountName, priv_ab->accountName);
1664  return FALSE;
1665  }
1666 
1667  if (g_strcmp0(priv_aa->accountCode, priv_ab->accountCode) != 0)
1668  {
1669  PWARN ("codes differ: %s vs %s", priv_aa->accountCode, priv_ab->accountCode);
1670  return FALSE;
1671  }
1672 
1673  if (g_strcmp0(priv_aa->description, priv_ab->description) != 0)
1674  {
1675  PWARN ("descriptions differ: %s vs %s", priv_aa->description, priv_ab->description);
1676  return FALSE;
1677  }
1678 
1679  if (!gnc_commodity_equal(priv_aa->commodity, priv_ab->commodity))
1680  {
1681  PWARN ("commodities differ");
1682  return FALSE;
1683  }
1684 
1685  if (check_guids)
1686  {
1687  if (qof_instance_guid_compare(aa, ab) != 0)
1688  {
1689  PWARN ("GUIDs differ");
1690  return FALSE;
1691  }
1692  }
1693 
1694  if (qof_instance_compare_kvp (QOF_INSTANCE (aa), QOF_INSTANCE (ab)) != 0)
1695  {
1696  char *frame_a;
1697  char *frame_b;
1698 
1699  frame_a = qof_instance_kvp_as_string (QOF_INSTANCE (aa));
1700  frame_b = qof_instance_kvp_as_string (QOF_INSTANCE (ab));
1701 
1702  PWARN ("kvp frames differ:\n%s\n\nvs\n\n%s", frame_a, frame_b);
1703 
1704  g_free (frame_a);
1705  g_free (frame_b);
1706 
1707  return FALSE;
1708  }
1709 
1710  if (!gnc_numeric_equal(priv_aa->starting_balance, priv_ab->starting_balance))
1711  {
1712  char *str_a;
1713  char *str_b;
1714 
1715  str_a = gnc_numeric_to_string(priv_aa->starting_balance);
1716  str_b = gnc_numeric_to_string(priv_ab->starting_balance);
1717 
1718  PWARN ("starting balances differ: %s vs %s", str_a, str_b);
1719 
1720  g_free (str_a);
1721  g_free (str_b);
1722 
1723  return FALSE;
1724  }
1725 
1726  if (!gnc_numeric_equal(priv_aa->starting_noclosing_balance,
1727  priv_ab->starting_noclosing_balance))
1728  {
1729  char *str_a;
1730  char *str_b;
1731 
1732  str_a = gnc_numeric_to_string(priv_aa->starting_noclosing_balance);
1733  str_b = gnc_numeric_to_string(priv_ab->starting_noclosing_balance);
1734 
1735  PWARN ("starting noclosing balances differ: %s vs %s", str_a, str_b);
1736 
1737  g_free (str_a);
1738  g_free (str_b);
1739 
1740  return FALSE;
1741  }
1742  if (!gnc_numeric_equal(priv_aa->starting_cleared_balance,
1743  priv_ab->starting_cleared_balance))
1744  {
1745  char *str_a;
1746  char *str_b;
1747 
1748  str_a = gnc_numeric_to_string(priv_aa->starting_cleared_balance);
1749  str_b = gnc_numeric_to_string(priv_ab->starting_cleared_balance);
1750 
1751  PWARN ("starting cleared balances differ: %s vs %s", str_a, str_b);
1752 
1753  g_free (str_a);
1754  g_free (str_b);
1755 
1756  return FALSE;
1757  }
1758 
1759  if (!gnc_numeric_equal(priv_aa->starting_reconciled_balance,
1760  priv_ab->starting_reconciled_balance))
1761  {
1762  char *str_a;
1763  char *str_b;
1764 
1765  str_a = gnc_numeric_to_string(priv_aa->starting_reconciled_balance);
1766  str_b = gnc_numeric_to_string(priv_ab->starting_reconciled_balance);
1767 
1768  PWARN ("starting reconciled balances differ: %s vs %s", str_a, str_b);
1769 
1770  g_free (str_a);
1771  g_free (str_b);
1772 
1773  return FALSE;
1774  }
1775 
1776  if (!gnc_numeric_equal(priv_aa->balance, priv_ab->balance))
1777  {
1778  char *str_a;
1779  char *str_b;
1780 
1781  str_a = gnc_numeric_to_string(priv_aa->balance);
1782  str_b = gnc_numeric_to_string(priv_ab->balance);
1783 
1784  PWARN ("balances differ: %s vs %s", str_a, str_b);
1785 
1786  g_free (str_a);
1787  g_free (str_b);
1788 
1789  return FALSE;
1790  }
1791 
1792  if (!gnc_numeric_equal(priv_aa->noclosing_balance, priv_ab->noclosing_balance))
1793  {
1794  char *str_a;
1795  char *str_b;
1796 
1797  str_a = gnc_numeric_to_string(priv_aa->noclosing_balance);
1798  str_b = gnc_numeric_to_string(priv_ab->noclosing_balance);
1799 
1800  PWARN ("noclosing balances differ: %s vs %s", str_a, str_b);
1801 
1802  g_free (str_a);
1803  g_free (str_b);
1804 
1805  return FALSE;
1806  }
1807  if (!gnc_numeric_equal(priv_aa->cleared_balance, priv_ab->cleared_balance))
1808  {
1809  char *str_a;
1810  char *str_b;
1811 
1812  str_a = gnc_numeric_to_string(priv_aa->cleared_balance);
1813  str_b = gnc_numeric_to_string(priv_ab->cleared_balance);
1814 
1815  PWARN ("cleared balances differ: %s vs %s", str_a, str_b);
1816 
1817  g_free (str_a);
1818  g_free (str_b);
1819 
1820  return FALSE;
1821  }
1822 
1823  if (!gnc_numeric_equal(priv_aa->reconciled_balance, priv_ab->reconciled_balance))
1824  {
1825  char *str_a;
1826  char *str_b;
1827 
1828  str_a = gnc_numeric_to_string(priv_aa->reconciled_balance);
1829  str_b = gnc_numeric_to_string(priv_ab->reconciled_balance);
1830 
1831  PWARN ("reconciled balances differ: %s vs %s", str_a, str_b);
1832 
1833  g_free (str_a);
1834  g_free (str_b);
1835 
1836  return FALSE;
1837  }
1838 
1839  /* no parent; always compare downwards. */
1840 
1841  {
1842  GList *la = priv_aa->splits;
1843  GList *lb = priv_ab->splits;
1844 
1845  if ((la && !lb) || (!la && lb))
1846  {
1847  PWARN ("only one has splits");
1848  return FALSE;
1849  }
1850 
1851  if (la && lb)
1852  {
1853  /* presume that the splits are in the same order */
1854  while (la && lb)
1855  {
1856  Split *sa = (Split *) la->data;
1857  Split *sb = (Split *) lb->data;
1858 
1859  if (!xaccSplitEqual(sa, sb, check_guids, TRUE, FALSE))
1860  {
1861  PWARN ("splits differ");
1862  return(FALSE);
1863  }
1864 
1865  la = la->next;
1866  lb = lb->next;
1867  }
1868 
1869  if ((la != NULL) || (lb != NULL))
1870  {
1871  PWARN ("number of splits differs");
1872  return(FALSE);
1873  }
1874  }
1875  }
1876 
1877  if (!xaccAcctChildrenEqual(priv_aa->children, priv_ab->children, check_guids))
1878  {
1879  PWARN ("children differ");
1880  return FALSE;
1881  }
1882 
1883  return(TRUE);
1884 }
gboolean gnc_numeric_equal(gnc_numeric a, gnc_numeric b)
Equivalence predicate: Returns TRUE (1) if a and b represent the same number.
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equal.
gchar * gnc_numeric_to_string(gnc_numeric n)
Convert to string.
gboolean xaccSplitEqual(const Split *sa, const Split *sb, gboolean check_guids, gboolean check_balances, gboolean check_txn_splits)
Equality.
Definition: Split.c:769
#define PWARN(format, args...)
Log a warning.
Definition: qoflog.h:250
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances.

◆ xaccAccountGainsAccount()

Account* xaccAccountGainsAccount ( Account acc,
gnc_commodity *  curr 
)

Retrieve the gains account used by this account for the indicated currency, creating and recording a new one if necessary.

FIXME: There is at present no interface to designate an existing account, and the new account name is hard coded to "Orphaned Gains -- CUR"

FIXME: There is no provision for creating separate accounts for anything other than currency, e.g. holding period of a security.

Definition at line 5000 of file Account.cpp.

5001 {
5002  GValue v = G_VALUE_INIT;
5003  std::vector<std::string> path {KEY_LOT_MGMT, "gains-acct",
5005  GncGUID *guid = NULL;
5006  Account *gains_account;
5007 
5008  g_return_val_if_fail (acc != NULL, NULL);
5009  qof_instance_get_path_kvp (QOF_INSTANCE(acc), &v, path);
5010  if (G_VALUE_HOLDS_BOXED (&v))
5011  guid = (GncGUID*)g_value_get_boxed (&v);
5012  if (guid == NULL) /* No gains account for this currency */
5013  {
5014  gains_account = GetOrMakeOrphanAccount (gnc_account_get_root (acc),
5015  curr);
5016  guid = (GncGUID*)qof_instance_get_guid (QOF_INSTANCE (gains_account));
5017  xaccAccountBeginEdit (acc);
5018  {
5019  GValue vr = G_VALUE_INIT;
5020  g_value_init (&vr, GNC_TYPE_GUID);
5021  g_value_set_boxed (&vr, guid);
5022  qof_instance_set_path_kvp (QOF_INSTANCE (acc), &vr, path);
5023  qof_instance_set_dirty (QOF_INSTANCE (acc));
5024  g_value_unset (&vr);
5025  }
5026  xaccAccountCommitEdit (acc);
5027  }
5028  else
5029  gains_account = xaccAccountLookup (guid,
5030  qof_instance_get_book(acc));
5031 
5032  g_value_unset (&v);
5033  return gains_account;
5034 }
const GncGUID * qof_instance_get_guid(gconstpointer inst)
Return the GncGUID of this instance.
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
Definition: Account.cpp:1449
const char * gnc_commodity_get_unique_name(const gnc_commodity *cm)
Retrieve the &#39;unique&#39; name for the specified commodity.
Account * gnc_account_get_root(Account *acc)
This routine returns the root account of the account tree that the specified account belongs to...
Definition: Account.cpp:2906
The type used to store guids in C.
Definition: guid.h:75
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
Definition: Account.cpp:1490
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)
The xaccAccountLookup() subroutine will return the account associated with the given id...
Definition: Account.cpp:2050

◆ xaccAccountGetBalanceAsOfDate()

gnc_numeric xaccAccountGetBalanceAsOfDate ( Account account,
time64  date 
)

Get the balance of the account at the end of the day before the date specified.

Definition at line 3620 of file Account.cpp.

3621 {
3622  return GetBalanceAsOfDate (acc, date, FALSE);
3623 }

◆ xaccAccountGetBalanceAsOfDateInCurrency()

gnc_numeric xaccAccountGetBalanceAsOfDateInCurrency ( Account account,
time64  date,
gnc_commodity *  report_commodity,
gboolean  include_children 
)

This function gets the balance at the end of the given date in the desired commodity.

Definition at line 3950 of file Account.cpp.

3953 {
3954  return xaccAccountGetXxxBalanceAsOfDateInCurrencyRecursive (
3955  acc, date, xaccAccountGetBalanceAsOfDate, report_commodity,
3956  include_children);
3957 }
gnc_numeric xaccAccountGetBalanceAsOfDate(Account *acc, time64 date)
Get the balance of the account at the end of the day before the date specified.
Definition: Account.cpp:3620

◆ xaccAccountGetCommoditySCU()

int xaccAccountGetCommoditySCU ( const Account account)

Return the SCU for the account.

If a non-standard SCU has been set for the account, that is returned; else the default SCU for the account commodity is returned.

Definition at line 2701 of file Account.cpp.

2702 {
2703  AccountPrivate *priv;
2704 
2705  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), 0);
2706 
2707  priv = GET_PRIVATE(acc);
2708  if (priv->non_standard_scu || !priv->commodity)
2709  return priv->commodity_scu;
2710  return gnc_commodity_get_fraction(priv->commodity);
2711 }
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.

◆ xaccAccountGetCommoditySCUi()

int xaccAccountGetCommoditySCUi ( const Account account)

Return the 'internal' SCU setting.

This returns the over-ride SCU for the account (which might not be set, and might be zero).

Definition at line 2694 of file Account.cpp.

2695 {
2696  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), 0);
2697  return GET_PRIVATE(acc)->commodity_scu;
2698 }

◆ xaccAccountGetNoclosingBalanceAsOfDateInCurrency()

gnc_numeric xaccAccountGetNoclosingBalanceAsOfDateInCurrency ( Account acc,
time64  date,
gnc_commodity *  report_commodity,
gboolean  include_children 
)

This function gets the balance at the end of the given date, ignoring closing entries, in the desired commodity.

Definition at line 3960 of file Account.cpp.

3963 {
3964  return xaccAccountGetXxxBalanceAsOfDateInCurrencyRecursive
3965  (acc, date, xaccAccountGetNoclosingBalanceAsOfDate,
3966  report_commodity, include_children);
3967 }

◆ xaccAccountGetNonStdSCU()

gboolean xaccAccountGetNonStdSCU ( const Account account)

Return boolean, indicating whether this account uses a non-standard SCU.

Definition at line 2730 of file Account.cpp.

2731 {
2732  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), 0);
2733  return GET_PRIVATE(acc)->non_standard_scu;
2734 }

◆ xaccAccountGetReconciledBalanceAsOfDate()

gnc_numeric xaccAccountGetReconciledBalanceAsOfDate ( Account account,
time64  date 
)

Get the reconciled balance of the account at the end of the day of the date specified.

Definition at line 3632 of file Account.cpp.

3633 {
3634  gnc_numeric balance = gnc_numeric_zero();
3635 
3636  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
3637 
3638  for (GList *node = GET_PRIVATE(acc)->splits; node; node = node->next)
3639  {
3640  Split *split = (Split*) node->data;
3641  if ((xaccSplitGetReconcile (split) == YREC) &&
3642  (xaccSplitGetDateReconciled (split) <= date))
3643  balance = gnc_numeric_add_fixed (balance, xaccSplitGetAmount (split));
3644  };
3645 
3646  return balance;
3647 }
char xaccSplitGetReconcile(const Split *split)
Returns the value of the reconcile flag.
#define YREC
The Split has been reconciled.
Definition: Split.h:72
time64 xaccSplitGetDateReconciled(const Split *split)
Retrieve the date when the Split was reconciled.
Definition: Split.c:1824
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account&#39;s commodity.
Definition: gmock-Split.cpp:69

◆ xaccAccountGetType()

GNCAccountType xaccAccountGetType ( const Account account)

Returns the account's account type.

This must not be confused with the GType as returned by gnc_account_get_type(), which is related to glib's type system.

Definition at line 3279 of file Account.cpp.

3280 {
3281  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), ACCT_TYPE_NONE);
3282  return GET_PRIVATE(acc)->type;
3283 }
Not a type.
Definition: Account.h:108

◆ xaccAccountHasAncestor()

gboolean xaccAccountHasAncestor ( const Account acc,
const Account ancestor 
)

Returns true if the account is 'ancestor' or has 'ancestor' as an ancestor.

An ancestor account may be the accounts parent, its parent's parent, its parent's parent's parent, etc. Returns false if either one is NULL.

Definition at line 4385 of file Account.cpp.

4386 {
4387  const Account *parent;
4388 
4389  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), FALSE);
4390  g_return_val_if_fail(GNC_IS_ACCOUNT(ancestor), FALSE);
4391 
4392  parent = acc;
4393  while (parent && parent != ancestor)
4394  parent = GET_PRIVATE(parent)->parent;
4395 
4396  return (parent == ancestor);
4397 }

◆ xaccAccountIsPriced()

gboolean xaccAccountIsPriced ( const Account acc)

Returns true if the account is a stock, mutual fund or currency, otherwise false.

Definition at line 4712 of file Account.cpp.

4713 {
4714  AccountPrivate *priv;
4715 
4716  g_return_val_if_fail(GNC_IS_ACCOUNT(acc), FALSE);
4717 
4718  priv = GET_PRIVATE(acc);
4719  return (priv->type == ACCT_TYPE_STOCK || priv->type == ACCT_TYPE_MUTUAL ||
4720  priv->type == ACCT_TYPE_CURRENCY);
4721 }
Mutual Fund accounts will typically be shown in registers which show three columns: price...
Definition: Account.h:128
Stock accounts will typically be shown in registers which show three columns: price, number of shares, and value.
Definition: Account.h:125
The currency account type indicates that the account is a currency trading account.
Definition: Account.h:132

◆ xaccAccountLookup()

Account* xaccAccountLookup ( const GncGUID guid,
QofBook *  book 
)

The xaccAccountLookup() subroutine will return the account associated with the given id, or NULL if there is no such account.

Definition at line 2050 of file Account.cpp.

2051 {
2052  QofCollection *col;
2053  if (!guid || !book) return NULL;
2054  col = qof_book_get_collection (book, GNC_ID_ACCOUNT);
2055  return (Account *) qof_collection_lookup_entity (col, guid);
2056 }
QofInstance * qof_collection_lookup_entity(const QofCollection *col, const GncGUID *guid)
Find the entity going only from its guid.
Definition: qofid.cpp:215
QofCollection * qof_book_get_collection(const QofBook *book, QofIdType entity_type)
Return The table of entities of the given type.
Definition: qofbook.cpp:604

◆ xaccAccountOrder()

int xaccAccountOrder ( const Account account_1,
const Account account_2 
)

The xaccAccountOrder() subroutine defines a sorting order on accounts.

It takes pointers to two accounts, and returns an int < 0 if the first account is "less than" the second, returns an int > 0 if the first is "greater than" the second, and 0 if they are equal. To determine the sort order, first the account codes are compared, and if these are equal, then account types, then account names. If still equal, it compares GUID to ensure that there aren't any ties.

Definition at line 2362 of file Account.cpp.

2363 {
2364  AccountPrivate *priv_aa, *priv_ab;
2365  const char *da, *db;
2366  char *endptr = NULL;
2367  int ta, tb, result;
2368  long la, lb;
2369 
2370  if ( aa && !ab ) return -1;
2371  if ( !aa && ab ) return +1;
2372  if ( !aa && !ab ) return 0;
2373 
2374  priv_aa = GET_PRIVATE(aa);
2375  priv_ab = GET_PRIVATE(ab);
2376 
2377  /* sort on accountCode strings */
2378  da = priv_aa->accountCode;
2379  db = priv_ab->accountCode;
2380 
2381  /* Otherwise do a string sort */
2382  result = g_strcmp0 (da, db);
2383  if (result)
2384  return result;
2385 
2386  /* if account-type-order array not initialized, initialize it */
2387  /* this will happen at most once during program invocation */
2388  if (-1 == revorder[0])
2389  {
2390  int i;
2391  for (i = 0; i < NUM_ACCOUNT_TYPES; i++)
2392  {
2393  revorder [typeorder[i]] = i;
2394  }
2395  }
2396 
2397  /* otherwise, sort on account type */
2398  ta = priv_aa->type;
2399  tb = priv_ab->type;
2400  ta = revorder[ta];
2401  tb = revorder[tb];
2402  if (ta < tb) return -1;
2403  if (ta > tb) return +1;
2404 
2405  /* otherwise, sort on accountName strings */
2406  da = priv_aa->accountName;
2407  db = priv_ab->accountName;
2408  result = safe_utf8_collate(da, db);
2409  if (result)
2410  return result;
2411 
2412  /* guarantee a stable sort */
2413  return qof_instance_guid_compare(aa, ab);
2414 }
int safe_utf8_collate(const char *da, const char *db)
Collate two UTF-8 strings.
stop here; the following types just aren&#39;t ready for prime time
Definition: Account.h:164
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances.

◆ xaccAccountSetCommoditySCU()

void xaccAccountSetCommoditySCU ( Account account,
int  frac 
)

Set the SCU for the account.

Normally, this routine is not required, as the default SCU for an account is given by its commodity.

Definition at line 2678 of file Account.cpp.

2679 {
2680  AccountPrivate *priv;
2681 
2682  g_return_if_fail(GNC_IS_ACCOUNT(acc));
2683 
2684  priv = GET_PRIVATE(acc);
2685  xaccAccountBeginEdit(acc);
2686  priv->commodity_scu = scu;
2687  if (scu != gnc_commodity_get_fraction(priv->commodity))
2688  priv->non_standard_scu = TRUE;
2689  mark_account(acc);
2690  xaccAccountCommitEdit(acc);
2691 }
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
Definition: Account.cpp:1449
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
Definition: Account.cpp:1490

◆ xaccAccountSetNonStdSCU()

void xaccAccountSetNonStdSCU ( Account account,
gboolean  flag 
)

Set the flag indicating that this account uses a non-standard SCU.

Definition at line 2714 of file Account.cpp.

2715 {
2716  AccountPrivate *priv;
2717 
2718  g_return_if_fail(GNC_IS_ACCOUNT(acc));
2719 
2720  priv = GET_PRIVATE(acc);
2721  if (priv->non_standard_scu == flag)
2722  return;
2723  xaccAccountBeginEdit(acc);
2724  priv->non_standard_scu = flag;
2725  mark_account (acc);
2726  xaccAccountCommitEdit(acc);
2727 }
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
Definition: Account.cpp:1449
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
Definition: Account.cpp:1490

◆ xaccAccountSortSplits()

void xaccAccountSortSplits ( Account acc,
gboolean  force 
)

The xaccAccountSortSplits() routine will resort the account's splits if the sort is dirty.

If 'force' is true, the account is sorted even if the editlevel is not zero.

Definition at line 2004 of file Account.cpp.

2005 {
2006  AccountPrivate *priv;
2007 
2008  g_return_if_fail(GNC_IS_ACCOUNT(acc));
2009 
2010  priv = GET_PRIVATE(acc);
2011  if (!priv->sort_dirty || (!force && qof_instance_get_editlevel(acc) > 0))
2012  return;
2013  priv->splits = g_list_sort(priv->splits, (GCompareFunc)xaccSplitOrder);
2014  priv->sort_dirty = FALSE;
2015  priv->balance_dirty = TRUE;
2016 }
gint xaccSplitOrder(const Split *sa, const Split *sb)
The xaccSplitOrder(sa,sb) method is useful for sorting.
Definition: Split.c:1504

◆ xaccCloneAccount()

Account* xaccCloneAccount ( const Account source,
QofBook *  book 
)

The xaccCloneAccount() routine makes a simple copy of the indicated account, placing it in the indicated book.

It copies the account type, name, description, and the kvp values; it does not copy splits/transactions. The book should have a commodity table in it that has commodities with the same unique name as the ones being copied in the account (the commodities in the clone will be those from the book).

Definition at line 1259 of file Account.cpp.

1260 {
1261  Account *ret;
1262  AccountPrivate *from_priv, *priv;
1263 
1264  g_return_val_if_fail(GNC_IS_ACCOUNT(from), NULL);
1265  g_return_val_if_fail(QOF_IS_BOOK(book), NULL);
1266 
1267  ENTER (" ");
1268  ret = static_cast<Account*>(g_object_new (GNC_TYPE_ACCOUNT, NULL));
1269  g_return_val_if_fail (ret, NULL);
1270 
1271  from_priv = GET_PRIVATE(from);
1272  priv = GET_PRIVATE(ret);
1273  xaccInitAccount (ret, book);
1274 
1275  /* Do not Begin/CommitEdit() here; give the caller
1276  * a chance to fix things up, and let them do it.
1277  * Also let caller issue the generate_event (EVENT_CREATE) */
1278  priv->type = from_priv->type;
1279 
1280  priv->accountName = qof_string_cache_replace(priv->accountName, from_priv->accountName);
1281  priv->accountCode = qof_string_cache_replace(priv->accountCode, from_priv->accountCode);
1282  priv->description = qof_string_cache_replace(priv->description, from_priv->description);
1283 
1284  qof_instance_copy_kvp (QOF_INSTANCE (ret), QOF_INSTANCE (from));
1285 
1286  /* The new book should contain a commodity that matches
1287  * the one in the old book. Find it, use it. */
1288  priv->commodity = gnc_commodity_obtain_twin(from_priv->commodity, book);
1289  gnc_commodity_increment_usage_count(priv->commodity);
1290 
1291  priv->commodity_scu = from_priv->commodity_scu;
1292  priv->non_standard_scu = from_priv->non_standard_scu;
1293 
1294  qof_instance_set_dirty(&ret->inst);
1295  LEAVE (" ");
1296  return ret;
1297 }
const char * qof_string_cache_replace(char const *dst, char const *src)
Same as CACHE_REPLACE below, but safe to call from C++.
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
void gnc_commodity_increment_usage_count(gnc_commodity *cm)
Increment a commodity&#39;s internal counter that tracks how many accounts are using that commodity...
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
gnc_commodity * gnc_commodity_obtain_twin(const gnc_commodity *from, QofBook *book)
Given the commodity &#39;findlike&#39;, this routine will find and return the equivalent commodity (commodity...