GnuCash  4.12-558-g06612b8434
Files | Macros | Functions

A good overview of transactions, splits and accounts can be found in the texinfo documentation, together with an overview of how to use this API. More...

Files

file  Split.h
 API for Transactions and Splits (journal entries)
 
file  Transaction.h
 API for Transactions and Splits (journal entries)
 

Macros

#define GNC_TYPE_SPLIT   (gnc_split_get_type ())
 
#define GNC_SPLIT(o)   (G_TYPE_CHECK_INSTANCE_CAST ((o), GNC_TYPE_SPLIT, Split))
 
#define GNC_SPLIT_CLASS(k)   (G_TYPE_CHECK_CLASS_CAST((k), GNC_TYPE_SPLIT, SplitClass))
 
#define GNC_IS_SPLIT(o)   (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNC_TYPE_SPLIT))
 
#define GNC_IS_SPLIT_CLASS(k)   (G_TYPE_CHECK_CLASS_TYPE ((k), GNC_TYPE_SPLIT))
 
#define GNC_SPLIT_GET_CLASS(o)   (G_TYPE_INSTANCE_GET_CLASS ((o), GNC_TYPE_SPLIT, SplitClass))
 
#define xaccSplitGetGUID(X)   qof_entity_get_guid(QOF_INSTANCE(X))
 
#define xaccSplitReturnGUID(X)   (X ? *(qof_entity_get_guid(QOF_INSTANCE(X))) : *(guid_null()))
 
#define GNC_TYPE_TRANSACTION   (gnc_transaction_get_type ())
 
#define GNC_TRANSACTION(o)   (G_TYPE_CHECK_INSTANCE_CAST ((o), GNC_TYPE_TRANSACTION, Transaction))
 
#define GNC_TRANSACTION_CLASS(k)   (G_TYPE_CHECK_CLASS_CAST((k), GNC_TYPE_TRANSACTION, TransactionClass))
 
#define GNC_IS_TRANSACTION(o)   (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNC_TYPE_TRANSACTION))
 
#define GNC_IS_TRANSACTION_CLASS(k)   (G_TYPE_CHECK_CLASS_TYPE ((k), GNC_TYPE_TRANSACTION))
 
#define GNC_TRANSACTION_GET_CLASS(o)   (G_TYPE_INSTANCE_GET_CLASS ((o), GNC_TYPE_TRANSACTION, TransactionClass))
 
#define GNC_IS_TRANS(obj)   GNC_IS_TRANSACTION(obj)
 
#define GNC_TRANS(obj)   GNC_TRANSACTION(obj)
 
#define RECONCILED_MATCH_TYPE   "reconciled-match"
 
#define xaccTransGetBook(X)   qof_instance_get_book (QOF_INSTANCE(X))
 
#define xaccTransGetGUID(X)   qof_entity_get_guid(QOF_INSTANCE(X))
 
#define xaccTransReturnGUID(X)   (X ? *(qof_entity_get_guid(QOF_INSTANCE(X))) : *(guid_null()))
 

Functions

GType gnc_split_get_type (void)
 
gnc_numeric xaccSplitConvertAmount (const Split *split, const Account *account)
 
GType gnc_transaction_get_type (void)
 
void xaccTransRecordPrice (Transaction *trans, PriceSource source)
 The xaccTransRecordPrice() method iterates through the splits and and record the non-currency equivalent prices in the price database. More...
 

Split Reconciled field values

If you change these
be sure to change gnc-ui-util.c:gnc_get_reconciled_str() and
associated functions
#define CREC   'c'
 The Split has been cleared.
 
#define YREC   'y'
 The Split has been reconciled.
 
#define FREC   'f'
 frozen into accounting period
 
#define NREC   'n'
 not reconciled or cleared
 
#define VREC   'v'
 split is void
 

Split general getters/setters

Split * xaccMallocSplit (QofBook *book)
 Constructor. More...
 
void xaccSplitReinit (Split *split)
 
gboolean xaccSplitDestroy (Split *split)
 Destructor. More...
 
void xaccSplitCopyOnto (const Split *from_split, Split *to_split)
 This is really a helper for xaccTransCopyOnto. More...
 
QofBook * xaccSplitGetBook (const Split *split)
 Returns the book of this split, i.e. More...
 
AccountxaccSplitGetAccount (const Split *split)
 Returns the account of this split, which was set through xaccAccountInsertSplit(). More...
 
void xaccSplitSetAccount (Split *s, Account *acc)
 
Transaction * xaccSplitGetParent (const Split *split)
 Returns the parent transaction of the split. More...
 
void xaccSplitSetParent (Split *split, Transaction *trans)
 
GNCLot * xaccSplitGetLot (const Split *split)
 Returns the pointer to the debited/credited Lot where this split belongs to, or NULL if it doesn't belong to any. More...
 
void xaccSplitSetLot (Split *split, GNCLot *lot)
 Assigns the split to a specific Lot.
 
void xaccSplitSetMemo (Split *split, const char *memo)
 The memo is an arbitrary string associated with a split. More...
 
const char * xaccSplitGetMemo (const Split *split)
 Returns the memo string. More...
 
void xaccSplitSetAction (Split *split, const char *action)
 The Action is an arbitrary user-assigned string. More...
 
const char * xaccSplitGetAction (const Split *split)
 Returns the action string. More...
 

Split Date getters/setters

void xaccSplitSetReconcile (Split *split, char reconciled_flag)
 Set the reconcile flag. More...
 
char xaccSplitGetReconcile (const Split *split)
 Returns the value of the reconcile flag. More...
 
void xaccSplitSetDateReconciledSecs (Split *split, time64 time)
 Set the date on which this split was reconciled by specifying the time as time64. More...
 
time64 xaccSplitGetDateReconciled (const Split *split)
 Retrieve the date when the Split was reconciled. More...
 

Split amount getters/setters


'value' vs.

'amount' of a Split: The 'value' is the amount of the transaction balancing commodity (i.e. currency) involved, 'amount' is the amount of the account's commodity involved.

void xaccSplitSetAmount (Split *split, gnc_numeric amount)
 The xaccSplitSetAmount() method sets the amount in the account's commodity that the split should have. More...
 
gnc_numeric xaccSplitGetAmount (const Split *split)
 Returns the amount of the split in the account's commodity. More...
 
void xaccSplitSetValue (Split *split, gnc_numeric value)
 The xaccSplitSetValue() method sets the value of this split in the transaction's commodity. More...
 
gnc_numeric xaccSplitGetValue (const Split *split)
 Returns the value of this split in the transaction's commodity. More...
 
void xaccSplitSetSharePriceAndAmount (Split *split, gnc_numeric price, gnc_numeric amount)
 The xaccSplitSetSharePriceAndAmount() method will simultaneously update the share price and the number of shares. More...
 
gnc_numeric xaccSplitGetSharePrice (const Split *split)
 Returns the price of the split, that is, the value divided by the amount. More...
 
void xaccSplitSetBaseValue (Split *split, gnc_numeric value, const gnc_commodity *base_currency)
 Depending on the base_currency, set either the value or the amount of this split or both: If the base_currency is the transaction's commodity, set the value. More...
 
gnc_numeric xaccSplitGetBaseValue (const Split *split, const gnc_commodity *base_currency)
 Depending on the base_currency, return either the value or the amount of this split: If the base_curreny is the transaction's commodity, return the value. More...
 
gnc_numeric xaccSplitGetBalance (const Split *split)
 Returns the running balance up to and including the indicated split. More...
 
gnc_numeric xaccSplitGetNoclosingBalance (const Split *split)
 The noclosing-balance is the currency-denominated balance of all transactions except 'closing' transactions. More...
 
gnc_numeric xaccSplitGetClearedBalance (const Split *split)
 The cleared-balance is the currency-denominated balance of all transactions that have been marked as cleared or reconciled. More...
 
gnc_numeric xaccSplitGetReconciledBalance (const Split *split)
 Returns the reconciled-balance of this split. More...
 

Split utility functions

gboolean xaccSplitEqual (const Split *sa, const Split *sb, gboolean check_guids, gboolean check_balances, gboolean check_txn_splits)
 Equality. More...
 
Split * xaccSplitLookup (const GncGUID *guid, QofBook *book)
 The xaccSplitLookup() subroutine will return the split associated with the given id, or NULL if there is no such split. More...
 
GList * xaccSplitListGetUniqueTransactionsReversed (const GList *splits)
 
GList * xaccSplitListGetUniqueTransactions (const GList *splits)
 
void xaccSplitAddPeerSplit (Split *split, const Split *other_split, const time64 timestamp)
 Add a peer split to this split's lot-split list. More...
 
gboolean xaccSplitHasPeers (const Split *split)
 Does this split have peers?
 
gboolean xaccSplitIsPeerSplit (const Split *split, const Split *other_split)
 Report if a split is a peer of this one. More...
 
void xaccSplitRemovePeerSplit (Split *split, const Split *other_split)
 Remove a peer split from this split's lot-split list. More...
 
void xaccSplitMergePeerSplits (Split *split, const Split *other_split)
 Merge the other_split's peer splits into split's peers. More...
 
Split * xaccSplitGetOtherSplit (const Split *split)
 The xaccSplitGetOtherSplit() is a convenience routine that returns the other of a pair of splits. More...
 
const char * xaccSplitGetType (const Split *s)
 The xaccIsPeerSplit() is a convenience routine that returns TRUE (a non-zero value) if the two splits share a common parent transaction, else it returns FALSE (zero). More...
 
void xaccSplitMakeStockSplit (Split *s)
 Mark a split to be of type stock split - after this, you shouldn't modify the value anymore, just the amount. More...
 
gint xaccSplitOrder (const Split *sa, const Split *sb)
 The xaccSplitOrder(sa,sb) method is useful for sorting. More...
 
gint xaccSplitOrderDateOnly (const Split *sa, const Split *sb)
 
int xaccSplitCompareAccountFullNames (const Split *sa, const Split *sb)
 Compare two splits by full name of account. More...
 
int xaccSplitCompareAccountCodes (const Split *sa, const Split *sb)
 Compare two splits by code of account. More...
 
int xaccSplitCompareOtherAccountFullNames (const Split *sa, const Split *sb)
 Compare two splits by full name of the other account. More...
 
int xaccSplitCompareOtherAccountCodes (const Split *sa, const Split *sb)
 Compare two splits by code of the other account. More...
 
char * xaccSplitGetCorrAccountFullName (const Split *sa)
 These functions take a split, get the corresponding split on the "other side" of the transaction, and extract either the name or code of that split, reverting to returning a constant "Split" if the transaction has more than one split on the "other side". More...
 
const char * xaccSplitGetCorrAccountName (const Split *sa)
 document me
 
const char * xaccSplitGetCorrAccountCode (const Split *sa)
 document me
 
#define xaccSplitLookupDirect(g, b)   xaccSplitLookup(&(g),b)
 

Split deprecated functions

void xaccSplitSetSharePrice (Split *split, gnc_numeric price)
 

Split voiding

gnc_numeric xaccSplitVoidFormerAmount (const Split *split)
 Returns the original pre-void amount of a split. More...
 
gnc_numeric xaccSplitVoidFormerValue (const Split *split)
 Returns the original pre-void value of a split. More...
 

Split Parameter names

Note, if you want to get the equivalent of "ACCT_MATCH_ALL" you need to create a search on the following parameter list: SPLIT->SPLIT_TRANS->TRANS_SPLITLIST->SPLIT_ACCOUNT_GUID.

If you do this, you might want to use the ACCOUNT_MATCH_ALL_TYPE as the override so the gnome-search dialog displays the right type.

#define SPLIT_DATE_RECONCILED   "date-reconciled"
 
#define SPLIT_BALANCE   "balance"
 
#define SPLIT_CLEARED_BALANCE   "cleared-balance"
 
#define SPLIT_RECONCILED_BALANCE   "reconciled-balance"
 
#define SPLIT_MEMO   "memo"
 
#define SPLIT_ACTION   "action"
 
#define SPLIT_RECONCILE   "reconcile-flag"
 
#define SPLIT_AMOUNT   "amount"
 
#define SPLIT_SHARE_PRICE   "share-price"
 
#define SPLIT_VALUE   "value"
 
#define SPLIT_TYPE   "type"
 
#define SPLIT_VOIDED_AMOUNT   "voided-amount"
 
#define SPLIT_VOIDED_VALUE   "voided-value"
 
#define SPLIT_LOT   "lot"
 
#define SPLIT_TRANS   "trans"
 
#define SPLIT_ACCOUNT   "account"
 
#define SPLIT_ACCOUNT_GUID   "account-guid"
 for guid_match_all
 
#define SPLIT_ACCT_FULLNAME   "acct-fullname"
 
#define SPLIT_CORR_ACCT_NAME   "corr-acct-fullname"
 
#define SPLIT_CORR_ACCT_CODE   "corr-acct-code"
 

Transaction Type field values

#define TXN_TYPE_UNCACHED   '?' /** Transaction type not yet cached */
 
#define TXN_TYPE_NONE   '\0'
 No transaction type.
 
#define TXN_TYPE_INVOICE   'I'
 Transaction is an invoice.
 
#define TXN_TYPE_PAYMENT   'P'
 Transaction is a payment.
 
#define TXN_TYPE_LINK   'L'
 Transaction is a link between (invoice and payment) lots.
 

Transaction creation and editing

Transaction * xaccMallocTransaction (QofBook *book)
 
The xaccMallocTransaction() will malloc memory and initialize it. More...
 
void xaccTransDestroy (Transaction *trans)
 Destroys a transaction. More...
 
Transaction * xaccTransClone (const Transaction *t)
 
The xaccTransClone() method will create a complete copy of an existing transaction.
 
Transaction * xaccTransCloneNoKvp (const Transaction *t)
 
The xaccTransCloneNoKvp() method will create a complete copy of an existing transaction except that the KVP slots will be empty.
 
gboolean xaccTransEqual (const Transaction *ta, const Transaction *tb, gboolean check_guids, gboolean check_splits, gboolean check_balances, gboolean assume_ordered)
 Equality. More...
 
void xaccTransBeginEdit (Transaction *trans)
 The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of its component splits. More...
 
void xaccTransCommitEdit (Transaction *trans)
 The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are complete and should be made permanent. More...
 
void xaccTransRollbackEdit (Transaction *trans)
 The xaccTransRollbackEdit() routine rejects all edits made, and sets the transaction back to where it was before the editing started. More...
 
gboolean xaccTransIsOpen (const Transaction *trans)
 The xaccTransIsOpen() method returns TRUE if the transaction is open for editing. More...
 
Transaction * xaccTransLookup (const GncGUID *guid, QofBook *book)
 The xaccTransLookup() subroutine will return the transaction associated with the given id, or NULL if there is no such transaction. More...
 
Transaction * xaccTransCopyToClipBoard (const Transaction *from_trans)
 Copy a transaction to the 'clipboard' transaction using dupe_transaction. More...
 
void xaccTransCopyOnto (const Transaction *from_trans, Transaction *to_trans)
 Copy a transaction to another using the function below without changing any account information.
 
void xaccTransCopyFromClipBoard (const Transaction *from_trans, Transaction *to_trans, const Account *from_acc, Account *to_acc, gboolean no_date)
 This function explicitly must robustly handle some unusual input. More...
 
Split * xaccTransFindSplitByAccount (const Transaction *trans, const Account *acc)
 
void xaccTransScrubGains (Transaction *trans, Account *gain_acc)
 The xaccTransScrubGains() routine performs a number of cleanup functions on the indicated transaction, with the end-goal of setting up a consistent set of gains/losses for all the splits in the transaction. More...
 
guint gnc_book_count_transactions (QofBook *book)
 
#define xaccTransLookupDirect(g, b)   xaccTransLookup(&(g),b)
 

Transaction general getters/setters

gboolean xaccTransUseTradingAccounts (const Transaction *trans)
 Determine whether this transaction should use commodity trading accounts.
 
void xaccTransSortSplits (Transaction *trans)
 Sorts the splits in a transaction, putting the debits first, followed by the credits.
 
void xaccTransSetTxnType (Transaction *trans, char type)
 Set the Transaction Type: note the type will be saved into the Transaction kvp property as a backward compatibility measure, for previous GnuCash versions whose xaccTransGetTxnType reads from the kvp slots. More...
 
char xaccTransGetTxnType (Transaction *trans)
 Returns the Transaction Type: note this type will be derived from the transaction splits, returning TXN_TYPE_NONE, TXN_TYPE_INVOICE, TXN_TYPE_LINK, or TXN_TYPE_PAYMENT according to heuristics. More...
 
void xaccTransSetNum (Transaction *trans, const char *num)
 Sets the transaction Number (or ID) field; rather than use this function directly, see 'gnc_set_num_action' in engine/engine-helpers.c & .h which takes a user-set book option for selecting the source for the num-cell (the transaction-number or the split-action field) in registers/reports into account automatically.
 
void xaccTransSetDescription (Transaction *trans, const char *desc)
 Sets the transaction Description.
 
void xaccTransSetDocLink (Transaction *trans, const char *doclink)
 Sets the transaction Document Link.
 
void xaccTransSetNotes (Transaction *trans, const char *notes)
 Sets the transaction Notes. More...
 
const char * xaccTransGetNum (const Transaction *trans)
 Gets the transaction Number (or ID) field; rather than use this function directly, see 'gnc_get_num_action' and 'gnc_get_action_num' in engine/engine-helpers.c & .h which takes a user-set book option for selecting the source for the num-cell (the transaction-number or the split-action field) in registers/reports into account automatically.
 
const char * xaccTransGetDescription (const Transaction *trans)
 Gets the transaction Description.
 
const char * xaccTransGetDocLink (const Transaction *trans)
 Gets the transaction Document Link.
 
const char * xaccTransGetNotes (const Transaction *trans)
 Gets the transaction Notes. More...
 
void xaccTransSetIsClosingTxn (Transaction *trans, gboolean is_closing)
 Sets whether or not this transaction is a "closing transaction".
 
gboolean xaccTransGetIsClosingTxn (const Transaction *trans)
 Returns whether this transaction is a "closing transaction".
 
Split * xaccTransGetSplit (const Transaction *trans, int i)
 Return a pointer to the indexed split in this transaction's split list. More...
 
int xaccTransGetSplitIndex (const Transaction *trans, const Split *split)
 Inverse of xaccTransGetSplit()
 
SplitListxaccTransGetSplitList (const Transaction *trans)
 The xaccTransGetSplitList() method returns a GList of the splits in a transaction. More...
 
SplitListxaccTransGetPaymentAcctSplitList (const Transaction *trans)
 The xaccTransGetPaymentAcctSplitList() method returns a GList of the splits in a transaction that belong to an account which is considered a valid account for business payments. More...
 
SplitListxaccTransGetAPARAcctSplitList (const Transaction *trans, gboolean strict)
 The xaccTransGetAPARSplitList() method returns a GList of the splits in a transaction that belong to an AR or AP account. More...
 
gboolean xaccTransStillHasSplit (const Transaction *trans, const Split *s)
 
Split * xaccTransGetFirstPaymentAcctSplit (const Transaction *trans)
 The xaccTransGetFirstPaymentAcctSplit() method returns a pointer to the first split in this transaction that belongs to an account which is considered a valid account for business payments. More...
 
Split * xaccTransGetFirstAPARAcctSplit (const Transaction *trans, gboolean strict)
 The xaccTransGetFirstPaymentAcctSplit() method returns a pointer to the first split in this transaction that belongs to an AR or AP account. More...
 
void xaccTransSetReadOnly (Transaction *trans, const char *reason)
 Set the transaction to be ReadOnly by setting a non-NULL value as "reason". More...
 
void xaccTransClearReadOnly (Transaction *trans)
 
const char * xaccTransGetReadOnly (Transaction *trans)
 Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text. More...
 
gboolean xaccTransIsReadonlyByPostedDate (const Transaction *trans)
 Returns TRUE if this Transaction is read-only because its posted-date is older than the "auto-readonly" threshold of this book. More...
 
gboolean xaccTransInFutureByPostedDate (const Transaction *trans)
 Returns TRUE if this Transaction's posted-date is in the future.
 
int xaccTransCountSplits (const Transaction *trans)
 Returns the number of splits in this transaction. More...
 
gboolean xaccTransHasReconciledSplits (const Transaction *trans)
 FIXME: document me.
 
gboolean xaccTransHasReconciledSplitsByAccount (const Transaction *trans, const Account *account)
 FIXME: document me.
 
gboolean xaccTransHasSplitsInState (const Transaction *trans, const char state)
 FIXME: document me.
 
gboolean xaccTransHasSplitsInStateByAccount (const Transaction *trans, const char state, const Account *account)
 FIXME: document me.
 
gnc_commodity * xaccTransGetCurrency (const Transaction *trans)
 Returns the valuation commodity of this transaction. More...
 
void xaccTransSetCurrency (Transaction *trans, gnc_commodity *curr)
 Set the commodity of this transaction. More...
 
gnc_numeric xaccTransGetImbalanceValue (const Transaction *trans)
 The xaccTransGetImbalanceValue() method returns the total value of the transaction. More...
 
MonetaryList * xaccTransGetImbalance (const Transaction *trans)
 The xaccTransGetImbalance method returns a list giving the value of the transaction in each currency for which the balance is not zero. More...
 
gboolean xaccTransIsBalanced (const Transaction *trans)
 Returns true if the transaction is balanced according to the rules currently in effect. More...
 
gnc_numeric xaccTransGetAccountValue (const Transaction *trans, const Account *account)
 The xaccTransGetAccountValue() method returns the total value applied to a particular account. More...
 
gnc_numeric xaccTransGetAccountAmount (const Transaction *trans, const Account *account)
 Same as xaccTransGetAccountValue, but uses the Account's commodity. More...
 
gboolean xaccTransGetRateForCommodity (const Transaction *trans, const gnc_commodity *split_com, const Split *split_to_exclude, gnc_numeric *rate)
 
gnc_numeric xaccTransGetAccountConvRate (const Transaction *txn, const Account *acc)
 
gnc_numeric xaccTransGetAccountBalance (const Transaction *trans, const Account *account)
 Get the account balance for the specified account after the last split in the specified transaction. More...
 
int xaccTransOrder (const Transaction *ta, const Transaction *tb)
 The xaccTransOrder(ta,tb) method is useful for sorting. More...
 
int xaccTransOrder_num_action (const Transaction *ta, const char *actna, const Transaction *tb, const char *actnb)
 The xaccTransOrder_num_action(ta,actna,tb,actnb) method is useful for sorting. More...
 
#define xaccTransAppendSplit(t, s)   xaccSplitSetParent((s), (t))
 Add a split to the transaction. More...
 

Transaction date setters/getters

void xaccTransSetDate (Transaction *trans, int day, int mon, int year)
 The xaccTransSetDate() method does the same thing as xaccTransSetDate[Posted]Secs(), but takes a convenient day-month-year format. More...
 
void xaccTransSetDatePostedGDate (Transaction *trans, GDate date)
 This method modifies posted date of the transaction, specified by a GDate. More...
 
void xaccTransSetDatePostedSecs (Transaction *trans, time64 time)
 The xaccTransSetDatePostedSecs() method will modify the posted date of the transaction, specified by a time64 (see ctime(3)). More...
 
void xaccTransSetDatePostedSecsNormalized (Transaction *trans, time64 time)
 This function sets the posted date of the transaction, specified by a time64 (see ctime(3)). More...
 
void xaccTransSetDateEnteredSecs (Transaction *trans, time64 time)
 Modify the date of when the transaction was entered. More...
 
void xaccTransSetDateDue (Transaction *trans, time64 time)
 Dates and txn-type for A/R and A/P "invoice" postings.
 
time64 xaccTransGetDate (const Transaction *trans)
 Retrieve the posted date of the transaction. More...
 
time64 xaccTransRetDatePosted (const Transaction *trans)
 Retrieve the posted date of the transaction. More...
 
GDate xaccTransGetDatePostedGDate (const Transaction *trans)
 Retrieve the posted date of the transaction. More...
 
time64 xaccTransGetDateEntered (const Transaction *trans)
 Retrieve the date of when the transaction was entered. More...
 
time64 xaccTransRetDateEntered (const Transaction *trans)
 Retrieve the date of when the transaction was entered. More...
 
time64 xaccTransRetDateDue (const Transaction *trans)
 Dates and txn-type for A/R and A/P "invoice" postings.
 

Transaction voiding

void xaccTransVoid (Transaction *transaction, const char *reason)
 xaccTransVoid voids a transaction. More...
 
void xaccTransUnvoid (Transaction *transaction)
 xaccTransUnvoid restores a voided transaction to its original state. More...
 
Transaction * xaccTransReverse (Transaction *transaction)
 xaccTransReverse creates a Transaction that reverses the given transaction by inverting all the numerical values in the given transaction. More...
 
Transaction * xaccTransGetReversedBy (const Transaction *trans)
 Returns the transaction that reversed the given transaction. More...
 
gboolean xaccTransGetVoidStatus (const Transaction *transaction)
 Retrieve information on whether or not a transaction has been voided. More...
 
const char * xaccTransGetVoidReason (const Transaction *transaction)
 Returns the user supplied textual reason why a transaction was voided. More...
 
time64 xaccTransGetVoidTime (const Transaction *tr)
 Returns the time that a transaction was voided. More...
 

Transaction Parameter names

#define TRANS_KVP   "kvp"
 
#define TRANS_NUM   "num"
 
#define TRANS_DESCRIPTION   "desc"
 
#define TRANS_DATE_ENTERED   "date-entered"
 
#define TRANS_DATE_POSTED   "date-posted"
 
#define TRANS_DATE_DUE   "date-due"
 
#define TRANS_IMBALANCE   "trans-imbalance"
 
#define TRANS_IS_BALANCED   "trans-balanced?"
 
#define TRANS_IS_CLOSING   "trans-is-closing?"
 
#define TRANS_NOTES   "notes"
 
#define TRANS_DOCLINK   "doclink"
 
#define TRANS_TYPE   "type"
 
#define TRANS_VOID_STATUS   "void-p"
 
#define TRANS_VOID_REASON   "void-reason"
 
#define TRANS_VOID_TIME   "void-time"
 
#define TRANS_SPLITLIST   "split-list" /* for guid_match_all */
 

Detailed Description

A good overview of transactions, splits and accounts can be found in the texinfo documentation, together with an overview of how to use this API.

Splits, or "Ledger Entries" are the fundamental accounting units. Each Split consists of an amount (number of dollar bills, number of shares, etc.), the value of that amount expressed in a (possibly) different currency than the amount, a Memo, a pointer to the parent Transaction, a pointer to the debited Account, a reconciled flag and timestamp, an "Action" field, and a key-value frame which can store arbitrary data.

Transactions embody the notion of "double entry" accounting. A Transaction consists of a date, a description, an ID number, a list of one or more Splits, and a key-value frame. The transaction also specifies the currency with which all of the splits will be valued. When double-entry rules are enforced, the sum total value of the splits are zero. If there are only two splits, then the value of one must be positive, the other negative: this denotes that one account is debited, and another is credited by an equal amount. By forcing the value of the splits to always 'add up' to zero, we can guarantee that the balances of the accounts are always correctly balanced.

The engine does not enforce double-entry accounting, but provides an API to enable user-code to find unbalanced transactions and 'repair' them so that they are in balance.

Note the sum of the values of Splits in a Transaction is always computed with respect to a currency; thus splits can be balanced even when they are in different currencies, as long as they share a common currency. This feature allows currency-trading accounts to be established.

Every Split must point to its parent Transaction, and that Transaction must in turn include that Split in the Transaction's list of Splits. A Split can belong to at most one Transaction. These relationships are enforced by the engine. The engine user cannot accidentally destroy this relationship as long as they stick to using the API and never access internal structures directly.

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 tradable: 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. The nodes of the tree are called "Account Groups". 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

◆ xaccSplitGetGUID

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

Definition at line 554 of file Split.h.

◆ xaccSplitReturnGUID

#define xaccSplitReturnGUID (   X)    (X ? *(qof_entity_get_guid(QOF_INSTANCE(X))) : *(guid_null()))
Deprecated:

Definition at line 556 of file Split.h.

◆ xaccTransAppendSplit

#define xaccTransAppendSplit (   t,
 
)    xaccSplitSetParent((s), (t))

Add a split to the transaction.

The xaccTransAppendSplit() method will append the indicated split to the collection of splits in this transaction.

Note
If the split is already a part of another transaction, it will be removed from that transaction first.

Definition at line 370 of file Transaction.h.

◆ xaccTransGetBook

#define xaccTransGetBook (   X)    qof_instance_get_book (QOF_INSTANCE(X))
Deprecated:

Definition at line 791 of file Transaction.h.

◆ xaccTransGetGUID

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

Definition at line 793 of file Transaction.h.

◆ xaccTransReturnGUID

#define xaccTransReturnGUID (   X)    (X ? *(qof_entity_get_guid(QOF_INSTANCE(X))) : *(guid_null()))
Deprecated:

Definition at line 795 of file Transaction.h.

Function Documentation

◆ gnc_book_count_transactions()

guint gnc_book_count_transactions ( QofBook *  book)
Warning
XXX FIXME gnc_book_count_transactions is a utility function, probably needs to be moved to a utility file somewhere.

Definition at line 2773 of file Transaction.c.

2774 {
2775  guint count = 0;
2776  xaccAccountTreeForEachTransaction(gnc_book_get_root_account(book),
2777  counter_thunk, (void*)&count);
2778  return count;
2779 }
int xaccAccountTreeForEachTransaction(Account *acc, TransactionCallback proc, void *data)
Traverse all of the transactions in the given account group.

◆ xaccMallocSplit()

Split* xaccMallocSplit ( QofBook *  book)

Constructor.

Definition at line 37 of file gmock-Split.cpp.

38 {
39  SCOPED_TRACE("");
40  QofMockBook* mockbook = qof_mockbook(book);
41  return mockbook ? mockbook->malloc_split() : nullptr;
42 }

◆ xaccMallocTransaction()

Transaction* xaccMallocTransaction ( QofBook *  book)


The xaccMallocTransaction() will malloc memory and initialize it.

Once created, it is usually unsafe to merely "free" this memory; the xaccTransDestroy() method should be called.

Definition at line 511 of file Transaction.c.

512 {
513  Transaction *trans;
514 
515  g_return_val_if_fail (book, NULL);
516 
517  trans = g_object_new(GNC_TYPE_TRANSACTION, NULL);
518  xaccInitTransaction (trans, book);
519  qof_event_gen (&trans->inst, QOF_EVENT_CREATE, NULL);
520 
521  return trans;
522 }
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

◆ xaccSplitAddPeerSplit()

void xaccSplitAddPeerSplit ( Split *  split,
const Split *  other_split,
const time64  timestamp 
)

Add a peer split to this split's lot-split list.

Parameters
other_splitThe split whose guid to add
timestampThe time to be recorded for the split.

Definition at line 2012 of file Split.c.

2014 {
2015  const GncGUID* guid;
2016 
2017  g_return_if_fail (split != NULL);
2018  g_return_if_fail (other_split != NULL);
2019 
2020  guid = qof_instance_get_guid (QOF_INSTANCE (other_split));
2021  xaccTransBeginEdit (split->parent);
2022  qof_instance_kvp_add_guid (QOF_INSTANCE (split), "lot-split",
2023  gnc_time(NULL), "peer_guid", guid_copy(guid));
2024  mark_split (split);
2025  qof_instance_set_dirty (QOF_INSTANCE (split));
2026  xaccTransCommitEdit (split->parent);
2027 }
const GncGUID * qof_instance_get_guid(gconstpointer inst)
Return the GncGUID of this instance.
GncGUID * guid_copy(const GncGUID *guid)
Returns a newly allocated GncGUID that matches the passed-in GUID.
Definition: guid.cpp:121
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
time64 gnc_time(time64 *tbuf)
get the current local time
Definition: gnc-date.cpp:273
The type used to store guids in C.
Definition: guid.h:75

◆ xaccSplitCompareAccountCodes()

int xaccSplitCompareAccountCodes ( const Split *  sa,
const Split *  sb 
)

Compare two splits by code of account.

Returns similar to strcmp.

Definition at line 1669 of file Split.c.

1670 {
1671  Account *aa, *ab;
1672  if (!sa && !sb) return 0;
1673  if (!sa) return -1;
1674  if (!sb) return 1;
1675 
1676  aa = sa->acc;
1677  ab = sb->acc;
1678 
1679  return g_strcmp0(xaccAccountGetCode(aa), xaccAccountGetCode(ab));
1680 }
const char * xaccAccountGetCode(const Account *acc)
Get the account's accounting code.
Definition: Account.cpp:3356

◆ xaccSplitCompareAccountFullNames()

int xaccSplitCompareAccountFullNames ( const Split *  sa,
const Split *  sb 
)

Compare two splits by full name of account.

Returns similar to strcmp.

Definition at line 1648 of file Split.c.

1649 {
1650  Account *aa, *ab;
1651  char *full_a, *full_b;
1652  int retval;
1653  if (!sa && !sb) return 0;
1654  if (!sa) return -1;
1655  if (!sb) return 1;
1656 
1657  aa = sa->acc;
1658  ab = sb->acc;
1659  full_a = gnc_account_get_full_name(aa);
1660  full_b = gnc_account_get_full_name(ab);
1661  retval = g_utf8_collate(full_a, full_b);
1662  g_free(full_a);
1663  g_free(full_b);
1664  return retval;
1665 }
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...
Definition: Account.cpp:3308

◆ xaccSplitCompareOtherAccountCodes()

int xaccSplitCompareOtherAccountCodes ( const Split *  sa,
const Split *  sb 
)

Compare two splits by code of the other account.

Returns similar to strcmp. This function attempts to find the split on the other side of a transaction and compare on it.

Definition at line 1704 of file Split.c.

1705 {
1706  const char *ca, *cb;
1707  if (!sa && !sb) return 0;
1708  if (!sa) return -1;
1709  if (!sb) return 1;
1710 
1711  ca = xaccSplitGetCorrAccountCode(sa);
1712  cb = xaccSplitGetCorrAccountCode(sb);
1713  return g_strcmp0(ca, cb);
1714 }
const char * xaccSplitGetCorrAccountCode(const Split *sa)
document me
Definition: Split.c:1631

◆ xaccSplitCompareOtherAccountFullNames()

int xaccSplitCompareOtherAccountFullNames ( const Split *  sa,
const Split *  sb 
)

Compare two splits by full name of the other account.

Returns similar to strcmp. This function attempts to find the split on the other side of a transaction and compare on it.

Definition at line 1683 of file Split.c.

1684 {
1685  char *ca, *cb;
1686  int retval;
1687  if (!sa && !sb) return 0;
1688  if (!sa) return -1;
1689  if (!sb) return 1;
1690 
1691  /* doesn't matter what separator we use
1692  * as long as they are the same
1693  */
1694 
1697  retval = g_strcmp0(ca, cb);
1698  g_free(ca);
1699  g_free(cb);
1700  return retval;
1701 }
char * xaccSplitGetCorrAccountFullName(const Split *sa)
These functions take a split, get the corresponding split on the "other side" of the transaction...
Definition: Split.c:1615

◆ xaccSplitCopyOnto()

void xaccSplitCopyOnto ( const Split *  from_split,
Split *  to_split 
)

This is really a helper for xaccTransCopyOnto.

It doesn't reparent the 'to' split to from's transaction, because xaccTransCopyOnto is responsible for parenting the split to the correct transaction. Also, from's parent transaction may not even be a valid transaction, so this function may not modify anything about 'from' or from's transaction.

Definition at line 639 of file Split.c.

640 {
641  if (!from_split || !to_split) return;
642  xaccTransBeginEdit (to_split->parent);
643 
644  xaccSplitSetMemo(to_split, xaccSplitGetMemo(from_split));
645  xaccSplitSetAction(to_split, xaccSplitGetAction(from_split));
646  xaccSplitSetAmount(to_split, xaccSplitGetAmount(from_split));
647  xaccSplitSetValue(to_split, xaccSplitGetValue(from_split));
648  /* Setting the account is okay here because, even though the from
649  split might not really belong to the account it claims to,
650  setting the account won't cause any event involving from. */
651  xaccSplitSetAccount(to_split, xaccSplitGetAccount(from_split));
652  /* N.B. Don't set parent. */
653 
654  qof_instance_set_dirty(QOF_INSTANCE(to_split));
655  xaccTransCommitEdit(to_split->parent);
656 }
void xaccSplitSetValue(Split *s, gnc_numeric amt)
The xaccSplitSetValue() method sets the value of this split in the transaction's commodity.
Definition: Split.c:1262
void xaccSplitSetAction(Split *split, const char *actn)
The Action is an arbitrary user-assigned string.
Definition: Split.c:1743
void xaccSplitSetAmount(Split *s, gnc_numeric amt)
The xaccSplitSetAmount() method sets the amount in the account's commodity that the split should have...
Definition: Split.c:1226
void xaccSplitSetMemo(Split *split, const char *memo)
The memo is an arbitrary string associated with a split.
Definition: Split.c:1724
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction's commodity.
Definition: Split.c:1917
Account * xaccSplitGetAccount(const Split *s)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: Split.c:936
const char * xaccSplitGetMemo(const Split *split)
Returns the memo string.
Definition: Split.c:1892
const char * xaccSplitGetAction(const Split *split)
Returns the action string.
Definition: Split.c:1898
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account's commodity.
Definition: Split.c:1911

◆ xaccSplitDestroy()

gboolean xaccSplitDestroy ( Split *  split)

Destructor.

The xaccSplitDestroy() method will update its parent account and transaction in a consistent manner, resulting in the complete unlinking of the split, and the freeing of its associated memory. The goal of this routine is to perform the removal and destruction of the split in an atomic fashion, with no chance of accidentally leaving the accounting structure out-of-balance or otherwise inconsistent.

If the deletion of the split leaves the transaction with no splits, then the transaction will be marked for deletion. (It will not be deleted until the xaccTransCommitEdit() routine is called.)

Returns
TRUE upon successful deletion of the split. FALSE when the parenting Transaction is a read-only one.

Definition at line 1466 of file Split.c.

1467 {
1468  Account *acc;
1469  Transaction *trans;
1470  GncEventData ed;
1471 
1472  if (!split) return TRUE;
1473 
1474  acc = split->acc;
1475  trans = split->parent;
1476  if (acc && !qof_instance_get_destroying(acc)
1477  && !qof_instance_get_destroying(trans)
1478  && xaccTransGetReadOnly(trans))
1479  return FALSE;
1480 
1481  xaccTransBeginEdit(trans);
1482  ed.node = split;
1483  ed.idx = xaccTransGetSplitIndex(trans, split);
1484  qof_instance_set_dirty(QOF_INSTANCE(split));
1485  qof_instance_set_destroying(split, TRUE);
1486  qof_event_gen(&trans->inst, GNC_EVENT_ITEM_REMOVED, &ed);
1487  xaccTransCommitEdit(trans);
1488 
1489  return TRUE;
1490 }
const char * xaccTransGetReadOnly(Transaction *trans)
Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text...
Definition: Transaction.c:2596
gboolean qof_instance_get_destroying(gconstpointer ptr)
Retrieve the flag that indicates whether or not this object is about to be destroyed.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
int xaccTransGetSplitIndex(const Transaction *trans, const Split *split)
Inverse of xaccTransGetSplit()
Definition: Transaction.c:2311
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

◆ xaccSplitEqual()

gboolean xaccSplitEqual ( const Split *  sa,
const Split *  sb,
gboolean  check_guids,
gboolean  check_balances,
gboolean  check_txn_splits 
)

Equality.

Parameters
saFirst split to compare
sbSecond split to compare
check_guidsIf TRUE, try a guid_equal() on the GUIDs of both splits if their pointers are not equal in the first place.
check_balancesIf TRUE, compare balances between the two splits. Balances are recalculated whenever a split is added or removed from an account, so YMMV on whether this should be set.
check_txn_splitsIf the pointers are not equal, but everything else so far is equal (including memo, amount, value, kvp), then, when comparing the parenting transactions with xaccTransEqual(), set its argument check_splits to be TRUE.

Definition at line 769 of file Split.c.

773 {
774  gboolean same_book;
775 
776  if (!sa && !sb) return TRUE; /* Arguable. FALSE is better, methinks */
777 
778  if (!sa || !sb)
779  {
780  PINFO ("one is NULL");
781  return FALSE;
782  }
783 
784  if (sa == sb) return TRUE;
785 
786  same_book = qof_instance_get_book(QOF_INSTANCE(sa)) == qof_instance_get_book(QOF_INSTANCE(sb));
787 
788  if (check_guids)
789  {
790  if (qof_instance_guid_compare(sa, sb) != 0)
791  {
792  PINFO ("GUIDs differ");
793  return FALSE;
794  }
795  }
796 
797  /* If the same book, since these strings are cached we can just use pointer equality */
798  if ((same_book && sa->memo != sb->memo) || (!same_book && g_strcmp0(sa->memo, sb->memo) != 0))
799  {
800  PINFO ("memos differ: (%p)%s vs (%p)%s",
801  sa->memo, sa->memo, sb->memo, sb->memo);
802  return FALSE;
803  }
804 
805  if ((same_book && sa->action != sb->action) || (!same_book && g_strcmp0(sa->action, sb->action) != 0))
806  {
807  PINFO ("actions differ: %s vs %s", sa->action, sb->action);
808  return FALSE;
809  }
810 
811  if (qof_instance_compare_kvp (QOF_INSTANCE (sa), QOF_INSTANCE (sb)) != 0)
812  {
813  char *frame_a;
814  char *frame_b;
815 
816  frame_a = qof_instance_kvp_as_string (QOF_INSTANCE (sa));
817  frame_b = qof_instance_kvp_as_string (QOF_INSTANCE (sb));
818 
819  PINFO ("kvp frames differ:\n%s\n\nvs\n\n%s", frame_a, frame_b);
820 
821  g_free (frame_a);
822  g_free (frame_b);
823 
824  return FALSE;
825  }
826 
827  if (sa->reconciled != sb->reconciled)
828  {
829  PINFO ("reconcile flags differ: %c vs %c", sa->reconciled, sb->reconciled);
830  return FALSE;
831  }
832 
833  if (sa->date_reconciled != sb->date_reconciled)
834  {
835  PINFO ("reconciled date differs");
836  return FALSE;
837  }
838 
840  {
841  char *str_a;
842  char *str_b;
843 
846 
847  PINFO ("amounts differ: %s vs %s", str_a, str_b);
848 
849  g_free (str_a);
850  g_free (str_b);
851 
852  return FALSE;
853  }
854 
856  {
857  char *str_a;
858  char *str_b;
859 
862 
863  PINFO ("values differ: %s vs %s", str_a, str_b);
864 
865  g_free (str_a);
866  g_free (str_b);
867 
868  return FALSE;
869  }
870 
871  if (check_balances)
872  {
873  if (!xaccSplitEqualCheckBal ("", sa->balance, sb->balance))
874  return FALSE;
875  if (!xaccSplitEqualCheckBal ("cleared ", sa->cleared_balance,
876  sb->cleared_balance))
877  return FALSE;
878  if (!xaccSplitEqualCheckBal ("reconciled ", sa->reconciled_balance,
879  sb->reconciled_balance))
880  return FALSE;
881  if (!xaccSplitEqualCheckBal ("noclosing ", sa->noclosing_balance,
882  sb->noclosing_balance))
883  return FALSE;
884  }
885 
886  if (!xaccTransEqual(sa->parent, sb->parent, check_guids, check_txn_splits,
887  check_balances, FALSE))
888  {
889  PINFO ("transactions differ");
890  return FALSE;
891  }
892 
893  return TRUE;
894 }
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
#define PINFO(format, args...)
Print an informational note.
Definition: qoflog.h:256
gchar * gnc_numeric_to_string(gnc_numeric n)
Convert to string.
gboolean xaccTransEqual(const Transaction *ta, const Transaction *tb, gboolean check_guids, gboolean check_splits, gboolean check_balances, gboolean assume_ordered)
Equality.
Definition: Transaction.c:875
gboolean gnc_numeric_eq(gnc_numeric a, gnc_numeric b)
Equivalence predicate: Returns TRUE (1) if a and b are exactly the same (have the same numerator and ...
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction's commodity.
Definition: Split.c:1917
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances.
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account's commodity.
Definition: Split.c:1911

◆ xaccSplitGetAccount()

Account* xaccSplitGetAccount ( const Split *  split)

Returns the account of this split, which was set through xaccAccountInsertSplit().

Definition at line 53 of file gmock-Split.cpp.

54 {
55  SCOPED_TRACE("");
56  auto mocksplit = gnc_mocksplit(split);
57  return mocksplit ? mocksplit->get_account() : nullptr;
58 }

◆ xaccSplitGetAction()

const char* xaccSplitGetAction ( const Split *  split)

Returns the action string.

Rather than use this function directly, see 'gnc_get_num_action' and 'gnc_get_action_num'in engine/engine-helpers.c & .h which takes a user-set book option for selecting the source for the num-cell (the transaction-number or the split-action field) in registers/reports into account automatically

Definition at line 129 of file gmock-Split.cpp.

130 {
131  SCOPED_TRACE("");
132  auto mocksplit = gnc_mocksplit(split);
133  return mocksplit ? mocksplit->get_action() : "";
134 }

◆ xaccSplitGetAmount()

gnc_numeric xaccSplitGetAmount ( const Split *  split)

Returns the amount of the split in the account's commodity.

Note that for cap-gains splits, this is slaved to the transaction that is causing the gains to occur.

Definition at line 69 of file gmock-Split.cpp.

70 {
71  SCOPED_TRACE("");
72  auto mocksplit = gnc_mocksplit(split);
73  return mocksplit ? mocksplit->get_amount() : gnc_numeric_zero();
74 }

◆ xaccSplitGetBalance()

gnc_numeric xaccSplitGetBalance ( const Split *  split)

Returns the running balance up to and including the indicated split.

The balance is the currency-denominated balance. For accounts with non-unit share prices, it is correctly adjusted for share prices.

Returns the running balance up to & including the indicated split.

Definition at line 1291 of file Split.c.

1292 {
1293  return s ? s->balance : gnc_numeric_zero();
1294 }

◆ xaccSplitGetBaseValue()

gnc_numeric xaccSplitGetBaseValue ( const Split *  split,
const gnc_commodity *  base_currency 
)

Depending on the base_currency, return either the value or the amount of this split: If the base_curreny is the transaction's commodity, return the value.

If it is the account's commodity, return the amount. If it is neither print a warning message and return gnc_numeric_zero().

Definition at line 1370 of file Split.c.

1371 {
1372  if (!s || !s->acc || !s->parent) return gnc_numeric_zero();
1373 
1374  /* be more precise -- the value depends on the currency we want it
1375  * expressed in. */
1376  if (gnc_commodity_equiv(xaccTransGetCurrency(s->parent), base_currency))
1377  return xaccSplitGetValue(s);
1378  if (gnc_commodity_equiv(xaccAccountGetCommodity(s->acc), base_currency))
1379  return xaccSplitGetAmount(s);
1380 
1381  PERR ("inappropriate base currency %s "
1382  "given split currency=%s and commodity=%s\n",
1383  gnc_commodity_get_printname(base_currency),
1386  return gnc_numeric_zero();
1387 }
#define PERR(format, args...)
Log a serious error.
Definition: qoflog.h:244
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
Retrieve the 'print' name for the specified commodity.
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction's commodity.
Definition: Split.c:1917
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity.
Definition: Account.cpp:3448
gnc_commodity * xaccTransGetCurrency(const Transaction *trans)
Returns the valuation commodity of this transaction.
Definition: Transaction.c:1367
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equivalent.
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account's commodity.
Definition: Split.c:1911

◆ xaccSplitGetBook()

QofBook* xaccSplitGetBook ( const Split *  split)

Returns the book of this split, i.e.

the entity where this split is stored.

Definition at line 45 of file gmock-Split.cpp.

46 {
47  SCOPED_TRACE("");
48  auto mocksplit = gnc_mocksplit(split);
49  return mocksplit ? mocksplit->get_book() : nullptr;
50 }

◆ xaccSplitGetClearedBalance()

gnc_numeric xaccSplitGetClearedBalance ( const Split *  split)

The cleared-balance is the currency-denominated balance of all transactions that have been marked as cleared or reconciled.

It is correctly adjusted for price fluctuations.

Returns the running balance up to & including the indicated split.

Definition at line 1303 of file Split.c.

1304 {
1305  return s ? s->cleared_balance : gnc_numeric_zero();
1306 }

◆ xaccSplitGetCorrAccountFullName()

char* xaccSplitGetCorrAccountFullName ( const Split *  sa)

These functions take a split, get the corresponding split on the "other side" of the transaction, and extract either the name or code of that split, reverting to returning a constant "Split" if the transaction has more than one split on the "other side".

These were added for the transaction report, and is in C because the code was already written in C for the above functions and duplication is silly.

Note that this will only return a real value in case of a two-split transaction as that is the only situation in which a reliable value can be returned. In other situations "-- Split Transaction --" will be returned as Account Name or "Split" for Account Code.

Definition at line 1615 of file Split.c.

1616 {
1617  static const char *split_const = NULL;
1618  const Split *other_split;
1619 
1620  if (!get_corr_account_split(sa, &other_split))
1621  {
1622  if (!split_const)
1623  split_const = _("-- Split Transaction --");
1624 
1625  return g_strdup(split_const);
1626  }
1627  return gnc_account_get_full_name(other_split->acc);
1628 }
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...
Definition: Account.cpp:3308

◆ xaccSplitGetDateReconciled()

time64 xaccSplitGetDateReconciled ( const Split *  split)

Retrieve the date when the Split was reconciled.

Definition at line 1816 of file Split.c.

1817 {
1818  return split ? split->date_reconciled : 0;
1819 }

◆ xaccSplitGetLot()

GNCLot* xaccSplitGetLot ( const Split *  split)

Returns the pointer to the debited/credited Lot where this split belongs to, or NULL if it doesn't belong to any.

Definition at line 1877 of file Split.c.

1878 {
1879  return split ? split->lot : NULL;
1880 }

◆ xaccSplitGetMemo()

const char* xaccSplitGetMemo ( const Split *  split)

Returns the memo string.

Definition at line 99 of file gmock-Split.cpp.

100 {
101  SCOPED_TRACE("");
102  auto mocksplit = gnc_mocksplit(split);
103  return mocksplit ? mocksplit->get_memo() : "";
104 }

◆ xaccSplitGetNoclosingBalance()

gnc_numeric xaccSplitGetNoclosingBalance ( const Split *  split)

The noclosing-balance is the currency-denominated balance of all transactions except 'closing' transactions.

It is correctly adjusted for price fluctuations.

Returns the running balance up to & including the indicated split.

Definition at line 1297 of file Split.c.

1298 {
1299  return s ? s->noclosing_balance : gnc_numeric_zero();
1300 }

◆ xaccSplitGetOtherSplit()

Split* xaccSplitGetOtherSplit ( const Split *  split)

The xaccSplitGetOtherSplit() is a convenience routine that returns the other of a pair of splits.

If there are more than two splits, it returns NULL.

Definition at line 137 of file gmock-Split.cpp.

138 {
139  SCOPED_TRACE("");
140  auto mocksplit = gnc_mocksplit(split);
141  return mocksplit ? mocksplit->get_other_split() : nullptr;
142 }

◆ xaccSplitGetParent()

Transaction* xaccSplitGetParent ( const Split *  split)

Returns the parent transaction of the split.

Definition at line 145 of file gmock-Split.cpp.

146 {
147  SCOPED_TRACE("");
148  auto mocksplit = gnc_mocksplit(split);
149  return mocksplit ? mocksplit->get_parent() : nullptr;
150 }

◆ xaccSplitGetReconcile()

char xaccSplitGetReconcile ( const Split *  split)

Returns the value of the reconcile flag.

Definition at line 107 of file gmock-Split.cpp.

108 {
109  SCOPED_TRACE("");
110  auto mocksplit = gnc_mocksplit(split);
111  return mocksplit ? mocksplit->get_reconcile() : VREC;
112 }
#define VREC
split is void
Definition: Split.h:75

◆ xaccSplitGetReconciledBalance()

gnc_numeric xaccSplitGetReconciledBalance ( const Split *  split)

Returns the reconciled-balance of this split.

The reconciled-balance is the currency-denominated balance of all transactions that have been marked as reconciled.

Returns the running balance up to & including the indicated split.

Definition at line 1309 of file Split.c.

1310 {
1311  return s ? s->reconciled_balance : gnc_numeric_zero();
1312 }

◆ xaccSplitGetSharePrice()

gnc_numeric xaccSplitGetSharePrice ( const Split *  split)

Returns the price of the split, that is, the value divided by the amount.

If the amount is zero, returns a gnc_numeric of value one.

Definition at line 1923 of file Split.c.

1924 {
1925  gnc_numeric amt, val, price;
1926  if (!split) return gnc_numeric_create(0, 1);
1927 
1928 
1929  /* if amount == 0, return 0
1930  * otherwise return value/amount
1931  */
1932 
1933  amt = xaccSplitGetAmount(split);
1934  val = xaccSplitGetValue(split);
1935  if (gnc_numeric_zero_p(amt))
1936  return gnc_numeric_create(0, 1);
1937 
1938  price = gnc_numeric_div(val, amt,
1941 
1942  /* During random checks we can get some very weird prices. Let's
1943  * handle some overflow and other error conditions by returning
1944  * zero. But still print an error to let us know it happened.
1945  */
1946  if (gnc_numeric_check(price))
1947  {
1948  PERR("Computing share price failed (%d): [ %" G_GINT64_FORMAT " / %"
1949  G_GINT64_FORMAT " ] / [ %" G_GINT64_FORMAT " / %" G_GINT64_FORMAT " ]",
1950  gnc_numeric_check(price), val.num, val.denom, amt.num, amt.denom);
1951  return gnc_numeric_create(0, 1);
1952  }
1953 
1954  return price;
1955 }
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
#define PERR(format, args...)
Log a serious error.
Definition: qoflog.h:244
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
Definition: gnc-numeric.h:166
gnc_numeric gnc_numeric_div(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Division.
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction's commodity.
Definition: Split.c:1917
GNCNumericErrorCode gnc_numeric_check(gnc_numeric in)
Check for error signal in value.
#define GNC_DENOM_AUTO
Values that can be passed as the 'denom' argument.
Definition: gnc-numeric.h:246
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account's commodity.
Definition: Split.c:1911

◆ xaccSplitGetType()

const char* xaccSplitGetType ( const Split *  s)

The xaccIsPeerSplit() is a convenience routine that returns TRUE (a non-zero value) if the two splits share a common parent transaction, else it returns FALSE (zero).

gboolean xaccIsPeerSplit (const Split *split_1, const Split *split_2); Returns the split type, which is either the string "normal", or "stock-split" for a split from a stock split (pun intended? :-).

Definition at line 1967 of file Split.c.

1968 {
1969  if (!s) return NULL;
1970  if (s->split_type == is_unset)
1971  {
1972  GValue v = G_VALUE_INIT;
1973  Split *split = (Split*) s;
1974  const char* type;
1975  qof_instance_get_kvp (QOF_INSTANCE (s), &v, 1, "split-type");
1976  type = G_VALUE_HOLDS_STRING (&v) ? g_value_get_string (&v) : NULL;
1977  if (!type || !g_strcmp0 (type, split_type_normal))
1978  split->split_type = (char*) split_type_normal;
1979  else if (!g_strcmp0 (type, split_type_stock_split))
1980  split->split_type = (char*) split_type_stock_split;
1981  else
1982  {
1983  PERR ("unexpected split-type %s, reset to normal.", type);
1984  split->split_type = split_type_normal;
1985  }
1986  g_value_unset (&v);
1987  }
1988  return s->split_type;
1989 }
#define PERR(format, args...)
Log a serious error.
Definition: qoflog.h:244
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.

◆ xaccSplitGetValue()

gnc_numeric xaccSplitGetValue ( const Split *  split)

Returns the value of this split in the transaction's commodity.

Note that for cap-gains splits, this is slaved to the transaction that is causing the gains to occur.

Definition at line 84 of file gmock-Split.cpp.

85 {
86  SCOPED_TRACE("");
87  auto mocksplit = gnc_mocksplit(split);
88  return mocksplit ? mocksplit->get_value() : gnc_numeric_zero();
89 }

◆ xaccSplitIsPeerSplit()

gboolean xaccSplitIsPeerSplit ( const Split *  split,
const Split *  other_split 
)

Report if a split is a peer of this one.

Parameters
other_splitThe split to test for being a peer of this one.
Returns
: True if other_split is registered as a peer of this one.

Definition at line 2036 of file Split.c.

2037 {
2038  const GncGUID* guid;
2039 
2040  g_return_val_if_fail (split != NULL, FALSE);
2041  g_return_val_if_fail (other_split != NULL, FALSE);
2042 
2043  guid = qof_instance_get_guid (QOF_INSTANCE (other_split));
2044  return qof_instance_kvp_has_guid (QOF_INSTANCE (split), "lot-split",
2045  "peer_guid", guid);
2046 }
const GncGUID * qof_instance_get_guid(gconstpointer inst)
Return the GncGUID of this instance.
The type used to store guids in C.
Definition: guid.h:75

◆ xaccSplitLookup()

Split* xaccSplitLookup ( const GncGUID guid,
QofBook *  book 
)

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

Definition at line 1072 of file Split.c.

1073 {
1074  QofCollection *col;
1075  if (!guid || !book) return NULL;
1076  col = qof_book_get_collection (book, GNC_ID_SPLIT);
1077  return (Split *) qof_collection_lookup_entity (col, guid);
1078 }
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:532

◆ xaccSplitMakeStockSplit()

void xaccSplitMakeStockSplit ( Split *  s)

Mark a split to be of type stock split - after this, you shouldn't modify the value anymore, just the amount.

Definition at line 1994 of file Split.c.

1995 {
1996  GValue v = G_VALUE_INIT;
1997  xaccTransBeginEdit (s->parent);
1998 
1999  s->value = gnc_numeric_zero();
2000  g_value_init (&v, G_TYPE_STRING);
2001  g_value_set_static_string (&v, split_type_stock_split);
2002  s->split_type = split_type_stock_split;
2003  qof_instance_set_kvp (QOF_INSTANCE (s), &v, 1, "split-type");
2004  SET_GAINS_VDIRTY(s);
2005  mark_split(s);
2006  qof_instance_set_dirty(QOF_INSTANCE(s));
2007  xaccTransCommitEdit(s->parent);
2008  g_value_unset (&v);
2009 }
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...

◆ xaccSplitMergePeerSplits()

void xaccSplitMergePeerSplits ( Split *  split,
const Split *  other_split 
)

Merge the other_split's peer splits into split's peers.

Parameters
other_splitThe split donating the peer splits.

Definition at line 2066 of file Split.c.

2067 {
2068  xaccTransBeginEdit (split->parent);
2069  qof_instance_kvp_merge_guids (QOF_INSTANCE (split),
2070  QOF_INSTANCE (other_split), "lot-split");
2071  mark_split (split);
2072  qof_instance_set_dirty (QOF_INSTANCE (split));
2073  xaccTransCommitEdit (split->parent);
2074 }
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...

◆ xaccSplitOrder()

gint xaccSplitOrder ( const Split *  sa,
const Split *  sb 
)

The xaccSplitOrder(sa,sb) method is useful for sorting.

if sa and sb have different transactions, return their xaccTransOrder return a negative value if split sa has a smaller currency-value than sb, return a positive value if split sa has a larger currency-value than sb, return a negative value if split sa has a smaller share-price than sb, return a positive value if split sa has a larger share-price than sb, then compares memo and action using the strcmp() c-library routine, returning what strcmp would return. Then it compares the reconciled flags, then the reconciled dates, Finally, it returns zero if all of the above match.

Definition at line 1496 of file Split.c.

1497 {
1498  int retval;
1499  int comp;
1500  const char *da, *db;
1501  gboolean action_for_num;
1502 
1503  if (sa == sb) return 0;
1504  /* nothing is always less than something */
1505  if (!sa) return -1;
1506  if (!sb) return +1;
1507 
1508  /* sort in transaction order, but use split action rather than trans num
1509  * according to book option */
1511  (xaccSplitGetBook (sa));
1512  if (action_for_num)
1513  retval = xaccTransOrder_num_action (sa->parent, sa->action,
1514  sb->parent, sb->action);
1515  else
1516  retval = xaccTransOrder (sa->parent, sb->parent);
1517  if (retval) return retval;
1518 
1519  /* otherwise, sort on memo strings */
1520  da = sa->memo ? sa->memo : "";
1521  db = sb->memo ? sb->memo : "";
1522  retval = g_utf8_collate (da, db);
1523  if (retval)
1524  return retval;
1525 
1526  /* otherwise, sort on action strings */
1527  da = sa->action ? sa->action : "";
1528  db = sb->action ? sb->action : "";
1529  retval = g_utf8_collate (da, db);
1530  if (retval != 0)
1531  return retval;
1532 
1533  /* the reconciled flag ... */
1534  if (sa->reconciled < sb->reconciled) return -1;
1535  if (sa->reconciled > sb->reconciled) return +1;
1536 
1537  /* compare amounts */
1539  if (comp < 0) return -1;
1540  if (comp > 0) return +1;
1541 
1543  if (comp < 0) return -1;
1544  if (comp > 0) return +1;
1545 
1546  /* if dates differ, return */
1547  if (sa->date_reconciled < sb->date_reconciled)
1548  return -1;
1549  else if (sa->date_reconciled > sb->date_reconciled)
1550  return 1;
1551 
1552  /* else, sort on guid - keeps sort stable. */
1553  retval = qof_instance_guid_compare(sa, sb);
1554  if (retval) return retval;
1555 
1556  return 0;
1557 }
gboolean qof_book_use_split_action_for_num_field(const QofBook *book)
Returns TRUE if this book uses split action field as the &#39;Num&#39; field, FALSE if it uses transaction nu...
int gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
Returns 1 if a>b, -1 if b>a, 0 if a == b.
QofBook * xaccSplitGetBook(const Split *split)
Returns the book of this split, i.e.
Definition: Split.c:1961
int xaccTransOrder_num_action(const Transaction *ta, const char *actna, const Transaction *tb, const char *actnb)
The xaccTransOrder_num_action(ta,actna,tb,actnb) method is useful for sorting.
Definition: Transaction.c:1932
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction&#39;s commodity.
Definition: Split.c:1917
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances.
int xaccTransOrder(const Transaction *ta, const Transaction *tb)
The xaccTransOrder(ta,tb) method is useful for sorting.
Definition: Transaction.c:1896
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account&#39;s commodity.
Definition: Split.c:1911

◆ xaccSplitRemovePeerSplit()

void xaccSplitRemovePeerSplit ( Split *  split,
const Split *  other_split 
)

Remove a peer split from this split's lot-split list.

Parameters
other_splitThe split whose guid to remove

Definition at line 2049 of file Split.c.

2050 {
2051  const GncGUID* guid;
2052 
2053  g_return_if_fail (split != NULL);
2054  g_return_if_fail (other_split != NULL);
2055 
2056  guid = qof_instance_get_guid (QOF_INSTANCE (other_split));
2057  xaccTransBeginEdit (split->parent);
2058  qof_instance_kvp_remove_guid (QOF_INSTANCE (split), "lot-split",
2059  "peer_guid", guid);
2060  mark_split (split);
2061  qof_instance_set_dirty (QOF_INSTANCE (split));
2062  xaccTransCommitEdit (split->parent);
2063 }
const GncGUID * qof_instance_get_guid(gconstpointer inst)
Return the GncGUID of this instance.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
The type used to store guids in C.
Definition: guid.h:75

◆ xaccSplitSetAction()

void xaccSplitSetAction ( Split *  split,
const char *  action 
)

The Action is an arbitrary user-assigned string.

The action field is an arbitrary user-assigned value. It is meant to be a very short (one to ten character) string that signifies the "type" of this split, such as e.g. Buy, Sell, Div, Withdraw, Deposit, ATM, Check, etc. The idea is that this field can be used to create custom reports or graphs of data. Note that the business features auto-fill this value, but doesn't depend on it. Rather than use this function directly, see 'gnc_set_num_action' in engine/engine-helpers.c & .h which takes a user-set book option for selecting the source for the num-cell (the transaction-number or the split-action field) in registers/reports into account automatically

Definition at line 1743 of file Split.c.

1744 {
1745  if (!split || !actn) return;
1746  xaccTransBeginEdit (split->parent);
1747 
1748  CACHE_REPLACE(split->action, actn);
1749  qof_instance_set_dirty(QOF_INSTANCE(split));
1750  xaccTransCommitEdit(split->parent);
1751 
1752 }
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...

◆ xaccSplitSetAmount()

void xaccSplitSetAmount ( Split *  split,
gnc_numeric  amount 
)

The xaccSplitSetAmount() method sets the amount in the account's commodity that the split should have.

The following four setter functions set the prices and amounts. All of the routines always maintain balance: that is, invoking any of them will cause other splits in the transaction to be modified so that the net value of the transaction is zero.

IMPORTANT: The split should be parented by an account before any of these routines are invoked! This is because the actual setting of amounts/values requires SCU settings from the account. If these are not available, then amounts/values will be set to -1/0, which is an invalid value. I believe this order dependency is a bug, but I'm too lazy to find, fix & test at the moment ...

Note
If you use this on a newly created transaction, make sure that the 'value' is also set so that it doesn't remain zero.

Definition at line 77 of file gmock-Split.cpp.

78 {
79  ASSERT_TRUE(GNC_IS_MOCKSPLIT(split));
80  gnc_mocksplit(split)->set_amount(amt);
81 }

◆ xaccSplitSetBaseValue()

void xaccSplitSetBaseValue ( Split *  split,
gnc_numeric  value,
const gnc_commodity *  base_currency 
)

Depending on the base_currency, set either the value or the amount of this split or both: If the base_currency is the transaction's commodity, set the value.

If it is the account's commodity, set the amount. If both, set both.

Note
WATCH OUT: When using this function and the transaction's and account's commodities are different, the amount or the value will be left as zero. This might screw up the multi-currency handling code in the register. So please think twice whether you need this function – using xaccSplitSetValue() together with xaccSplitSetAmount() is definitely the better and safer solution!

Definition at line 1315 of file Split.c.

1317 {
1318  const gnc_commodity *currency;
1319  const gnc_commodity *commodity;
1320 
1321  if (!s) return;
1322  xaccTransBeginEdit (s->parent);
1323 
1324  if (!s->acc)
1325  {
1326  PERR ("split must have a parent account");
1327  return;
1328  }
1329 
1330  currency = xaccTransGetCurrency (s->parent);
1331  commodity = xaccAccountGetCommodity (s->acc);
1332 
1333  /* If the base_currency is the transaction's commodity ('currency'),
1334  * set the value. If it's the account commodity, set the
1335  * amount. If both, set both. */
1336  if (gnc_commodity_equiv(currency, base_currency))
1337  {
1338  if (gnc_commodity_equiv(commodity, base_currency))
1339  {
1340  s->amount = gnc_numeric_convert(value,
1341  get_commodity_denom(s),
1343  }
1344  s->value = gnc_numeric_convert(value,
1345  get_currency_denom(s),
1347  }
1348  else if (gnc_commodity_equiv(commodity, base_currency))
1349  {
1350  s->amount = gnc_numeric_convert(value, get_commodity_denom(s),
1352  }
1353  else
1354  {
1355  PERR ("inappropriate base currency %s "
1356  "given split currency=%s and commodity=%s\n",
1357  gnc_commodity_get_printname(base_currency),
1358  gnc_commodity_get_printname(currency),
1359  gnc_commodity_get_printname(commodity));
1360  return;
1361  }
1362 
1363  SET_GAINS_A_VDIRTY(s);
1364  mark_split (s);
1365  qof_instance_set_dirty(QOF_INSTANCE(s));
1366  xaccTransCommitEdit(s->parent);
1367 }
#define PERR(format, args...)
Log a serious error.
Definition: qoflog.h:244
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
Definition: gnc-numeric.h:166
gnc_numeric gnc_numeric_convert(gnc_numeric n, gint64 denom, gint how)
Change the denominator of a gnc_numeric value to the specified denominator under standard arguments &#39;...
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
Retrieve the &#39;print&#39; name for the specified commodity.
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account&#39;s commodity.
Definition: Account.cpp:3448
gnc_commodity * xaccTransGetCurrency(const Transaction *trans)
Returns the valuation commodity of this transaction.
Definition: Transaction.c:1367
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equivalent.

◆ xaccSplitSetDateReconciledSecs()

void xaccSplitSetDateReconciledSecs ( Split *  split,
time64  time 
)

Set the date on which this split was reconciled by specifying the time as time64.

Definition at line 122 of file gmock-Split.cpp.

123 {
124  ASSERT_TRUE(GNC_IS_MOCKSPLIT(split));
125  gnc_mocksplit(split)->set_date_reconciled_secs(secs);
126 }

◆ xaccSplitSetMemo()

void xaccSplitSetMemo ( Split *  split,
const char *  memo 
)

The memo is an arbitrary string associated with a split.

It is intended to hold a short (zero to forty character) string that is displayed by the GUI along with this split. Users typically type in free form text from the GUI.

Definition at line 1724 of file Split.c.

1725 {
1726  if (!split || !memo) return;
1727  xaccTransBeginEdit (split->parent);
1728 
1729  CACHE_REPLACE(split->memo, memo);
1730  qof_instance_set_dirty(QOF_INSTANCE(split));
1731  xaccTransCommitEdit(split->parent);
1732 
1733 }
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...

◆ xaccSplitSetReconcile()

void xaccSplitSetReconcile ( Split *  split,
char  reconciled_flag 
)

Set the reconcile flag.

The Reconcile flag is a single char, whose values are typically are 'n', 'y', 'c'. In Transaction.h, macros are defined for typical values (e.g. CREC, YREC).

Definition at line 115 of file gmock-Split.cpp.

116 {
117  ASSERT_TRUE(GNC_IS_MOCKSPLIT(split));
118  gnc_mocksplit(split)->set_reconcile(recn);
119 }

◆ xaccSplitSetSharePrice()

void xaccSplitSetSharePrice ( Split *  split,
gnc_numeric  price 
)
Deprecated:
The xaccSplitSetSharePrice() method sets the price of the split.

DEPRECATED - set the value and amount instead.

Definition at line 1188 of file Split.c.

1189 {
1190  if (!s) return;
1191 
1192  if (gnc_numeric_zero_p (price))
1193  return;
1194 
1195  ENTER (" ");
1196  xaccTransBeginEdit (s->parent);
1197 
1198  s->value = gnc_numeric_mul(xaccSplitGetAmount(s),
1199  price, get_currency_denom(s),
1201 
1202  SET_GAINS_VDIRTY(s);
1203  mark_split (s);
1204  qof_instance_set_dirty(QOF_INSTANCE(s));
1205  xaccTransCommitEdit(s->parent);
1206  LEAVE ("");
1207 }
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
Definition: gnc-numeric.h:166
gnc_numeric gnc_numeric_mul(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Multiply a times b, returning the product.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account&#39;s commodity.
Definition: Split.c:1911

◆ xaccSplitSetSharePriceAndAmount()

void xaccSplitSetSharePriceAndAmount ( Split *  split,
gnc_numeric  price,
gnc_numeric  amount 
)

The xaccSplitSetSharePriceAndAmount() method will simultaneously update the share price and the number of shares.

This is a utility routine that is equivalent to a xaccSplitSetSharePrice() followed by and xaccSplitSetAmount(), except that it incurs the processing overhead of balancing only once, instead of twice.

Definition at line 1160 of file Split.c.

1161 {
1162  if (!s) return;
1163  ENTER (" ");
1164  xaccTransBeginEdit (s->parent);
1165 
1166  s->amount = gnc_numeric_convert(amt, get_commodity_denom(s),
1168  s->value = gnc_numeric_mul(s->amount, price,
1169  get_currency_denom(s), GNC_HOW_RND_ROUND_HALF_UP);
1170 
1171  SET_GAINS_A_VDIRTY(s);
1172  mark_split (s);
1173  qof_instance_set_dirty(QOF_INSTANCE(s));
1174  xaccTransCommitEdit(s->parent);
1175  LEAVE ("");
1176 }
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
Definition: gnc-numeric.h:166
gnc_numeric gnc_numeric_convert(gnc_numeric n, gint64 denom, gint how)
Change the denominator of a gnc_numeric value to the specified denominator under standard arguments &#39;...
gnc_numeric gnc_numeric_mul(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Multiply a times b, returning the product.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282

◆ xaccSplitSetValue()

void xaccSplitSetValue ( Split *  split,
gnc_numeric  value 
)

The xaccSplitSetValue() method sets the value of this split in the transaction's commodity.

Note
If you use this on a newly created transaction, make sure that the 'amount' is also set so that it doesn't remain zero.

Definition at line 92 of file gmock-Split.cpp.

93 {
94  ASSERT_TRUE(GNC_IS_MOCKSPLIT(split));
95  gnc_mocksplit(split)->set_value(val);
96 }

◆ xaccSplitVoidFormerAmount()

gnc_numeric xaccSplitVoidFormerAmount ( const Split *  split)

Returns the original pre-void amount of a split.

Parameters
splitThe split in question.
Returns
A gnc_numeric containing the original value of this split. Returns a gnc_numeric of zero upon error.

Definition at line 2119 of file Split.c.

2120 {
2121  GValue v = G_VALUE_INIT;
2122  gnc_numeric *num = NULL;
2123  gnc_numeric retval;
2124  g_return_val_if_fail(split, gnc_numeric_zero());
2125  qof_instance_get_kvp (QOF_INSTANCE (split), &v, 1, void_former_amt_str);
2126  if (G_VALUE_HOLDS_BOXED (&v))
2127  num = (gnc_numeric*)g_value_get_boxed (&v);
2128  retval = num ? *num : gnc_numeric_zero();
2129  g_value_unset (&v);
2130  return retval;
2131 }
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.

◆ xaccSplitVoidFormerValue()

gnc_numeric xaccSplitVoidFormerValue ( const Split *  split)

Returns the original pre-void value of a split.

Parameters
splitThe split in question.
Returns
A gnc_numeric containing the original amount of this split. Returns a gnc_numeric of zero upon error.

Definition at line 2134 of file Split.c.

2135 {
2136  GValue v = G_VALUE_INIT;
2137  gnc_numeric *num = NULL;
2138  gnc_numeric retval;
2139  g_return_val_if_fail(split, gnc_numeric_zero());
2140  qof_instance_get_kvp (QOF_INSTANCE (split), &v, 1, void_former_val_str);
2141  if (G_VALUE_HOLDS_BOXED (&v))
2142  num = (gnc_numeric*)g_value_get_boxed (&v);
2143  retval = num ? *num : gnc_numeric_zero();
2144  g_value_unset (&v);
2145  return retval;
2146 }
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.

◆ xaccTransBeginEdit()

void xaccTransBeginEdit ( Transaction *  trans)

The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of its component splits.

If this is not done, errors will result.

Definition at line 35 of file gmock-Transaction.cpp.

36 {
37  ASSERT_TRUE(GNC_IS_MOCKTRANSACTION(trans));
38  gnc_mocktransaction(trans)->begin_edit();
39 }

◆ xaccTransCommitEdit()

void xaccTransCommitEdit ( Transaction *  trans)

The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are complete and should be made permanent.

Note this routine may result in the deletion of the transaction, if the transaction is "empty" (has no splits), or of xaccTransDestroy() was called on the transaction.

Definition at line 42 of file gmock-Transaction.cpp.

43 {
44  ASSERT_TRUE(GNC_IS_MOCKTRANSACTION(trans));
45  gnc_mocktransaction(trans)->commit_edit();
46 }

◆ xaccTransCopyFromClipBoard()

void xaccTransCopyFromClipBoard ( const Transaction *  from_trans,
Transaction *  to_trans,
const Account from_acc,
Account to_acc,
gboolean  no_date 
)

This function explicitly must robustly handle some unusual input.

'from_trans' may be a duped trans (see xaccDupeTransaction), so its splits may not really belong to the accounts that they say they do.

'from_acc' need not be a valid account. It may be an already freed Account. Therefore, it must not be dereferenced at all.

Neither 'from_trans', nor 'from_acc', nor any of 'from's splits may be modified in any way.

'no_date' if TRUE will not copy the date posted.

The 'to_trans' transaction will end up with valid copies of from's splits. In addition, the copies of any of from's splits that were in from_acc (or at least claimed to be) will end up in to_acc.

Definition at line 751 of file Transaction.c.

753 {
754  gboolean change_accounts = FALSE;
755  GList *node;
756 
757  if (!from_trans || !to_trans)
758  return;
759 
760  change_accounts = from_acc && GNC_IS_ACCOUNT(to_acc) && from_acc != to_acc;
761  xaccTransBeginEdit(to_trans);
762 
763  FOR_EACH_SPLIT(to_trans, xaccSplitDestroy(s));
764  g_list_free(to_trans->splits);
765  to_trans->splits = NULL;
766 
767  xaccTransSetCurrency(to_trans, xaccTransGetCurrency(from_trans));
768  xaccTransSetDescription(to_trans, xaccTransGetDescription(from_trans));
769 
770  if ((xaccTransGetNum(to_trans) == NULL) || (g_strcmp0 (xaccTransGetNum(to_trans), "") == 0))
771  xaccTransSetNum(to_trans, xaccTransGetNum(from_trans));
772 
773  xaccTransSetNotes(to_trans, xaccTransGetNotes(from_trans));
774  xaccTransSetDocLink(to_trans, xaccTransGetDocLink (from_trans));
775  if(!no_date)
776  {
777  xaccTransSetDatePostedSecs(to_trans, xaccTransRetDatePosted (from_trans));
778  }
779 
780  /* Each new split will be parented to 'to' */
781  for (node = from_trans->splits; node; node = node->next)
782  {
783  Split *new_split = xaccMallocSplit( qof_instance_get_book(QOF_INSTANCE(from_trans)));
784  xaccSplitCopyOnto(node->data, new_split);
785  if (change_accounts && xaccSplitGetAccount(node->data) == from_acc)
786  xaccSplitSetAccount(new_split, to_acc);
787  xaccSplitSetParent(new_split, to_trans);
788  }
789  xaccTransCommitEdit(to_trans);
790 }
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
gboolean xaccSplitDestroy(Split *split)
Destructor.
Definition: Split.c:1466
void xaccTransSetNotes(Transaction *trans, const char *notes)
Sets the transaction Notes.
Definition: Transaction.c:2250
void xaccSplitCopyOnto(const Split *from_split, Split *to_split)
This is really a helper for xaccTransCopyOnto.
Definition: Split.c:639
void xaccTransSetDescription(Transaction *trans, const char *desc)
Sets the transaction Description.
Definition: Transaction.c:2200
void xaccTransSetNum(Transaction *trans, const char *xnum)
Sets the transaction Number (or ID) field; rather than use this function directly, see &#39;gnc_set_num_action&#39; in engine/engine-helpers.c & .h which takes a user-set book option for selecting the source for the num-cell (the transaction-number or the split-action field) in registers/reports into account automatically.
Definition: Transaction.c:2180
const char * xaccTransGetNum(const Transaction *trans)
Gets the transaction Number (or ID) field; rather than use this function directly, see &#39;gnc_get_num_action&#39; and &#39;gnc_get_action_num&#39; in engine/engine-helpers.c & .h which takes a user-set book option for selecting the source for the num-cell (the transaction-number or the split-action field) in registers/reports into account automatically.
Definition: Transaction.c:2413
const char * xaccTransGetDocLink(const Transaction *trans)
Gets the transaction Document Link.
Definition: Transaction.c:2425
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
Set a new currency on a transaction.
Definition: Transaction.c:1426
const char * xaccTransGetNotes(const Transaction *trans)
Gets the transaction Notes.
Definition: Transaction.c:2440
time64 xaccTransRetDatePosted(const Transaction *trans)
Retrieve the posted date of the transaction.
Definition: Transaction.c:2492
const char * xaccTransGetDescription(const Transaction *trans)
Gets the transaction Description.
Definition: Transaction.c:2419
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
Definition: Transaction.c:1654
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
Definition: Transaction.c:1455
Split * xaccMallocSplit(QofBook *book)
Constructor.
Definition: gmock-Split.cpp:37
void xaccTransSetDatePostedSecs(Transaction *trans, time64 secs)
The xaccTransSetDatePostedSecs() method will modify the posted date of the transaction, specified by a time64 (see ctime(3)).
Definition: Transaction.c:2019
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53
gnc_commodity * xaccTransGetCurrency(const Transaction *trans)
Returns the valuation commodity of this transaction.
Definition: Transaction.c:1367
void xaccTransSetDocLink(Transaction *trans, const char *doclink)
Sets the transaction Document Link.
Definition: Transaction.c:2211

◆ xaccTransCopyToClipBoard()

Transaction* xaccTransCopyToClipBoard ( const Transaction *  from_trans)

Copy a transaction to the 'clipboard' transaction using dupe_transaction.

The 'clipboard' transaction must never be dereferenced.

Definition at line 711 of file Transaction.c.

712 {
713  Transaction *to_trans;
714 
715  if (!from_trans)
716  return NULL;
717 
718  to_trans = dupe_trans(from_trans);
719  return to_trans;
720 }

◆ xaccTransCountSplits()

int xaccTransCountSplits ( const Transaction *  trans)

Returns the number of splits in this transaction.

Definition at line 2404 of file Transaction.c.

2405 {
2406  gint i = 0;
2407  g_return_val_if_fail (trans != NULL, 0);
2408  FOR_EACH_SPLIT(trans, i++);
2409  return i;
2410 }

◆ xaccTransDestroy()

void xaccTransDestroy ( Transaction *  trans)

Destroys a transaction.

Each split in transaction trans is removed from its account and destroyed as well.

If the transaction has not already been opened for editing with xaccTransBeginEdit() then the changes are committed immediately. Otherwise, the caller must follow up with either xaccTransCommitEdit(), in which case the transaction and split memory will be freed, or xaccTransRollbackEdit(), in which case nothing at all is freed, and everything is put back into original order.

Parameters
transthe transaction to destroy

Definition at line 142 of file gmock-Transaction.cpp.

143 {
144  ASSERT_TRUE(GNC_IS_MOCKTRANSACTION(trans));
145  gnc_mocktransaction(trans)->destroy();
146 }

◆ xaccTransEqual()

gboolean xaccTransEqual ( const Transaction *  ta,
const Transaction *  tb,
gboolean  check_guids,
gboolean  check_splits,
gboolean  check_balances,
gboolean  assume_ordered 
)

Equality.

Parameters
taFirst transaction to compare
tbSecond transaction to compare
check_guidsIf TRUE, try a guid_equal() on the GUIDs of both transactions if their pointers are not equal in the first place. Also passed to subsidiary calls to xaccSplitEqual.
check_splitsIf TRUE, after checking the transaction data structures for equality, also check all splits attached to the transaction for equality.
check_balancesIf TRUE, when checking splits also compare balances between the two splits. Balances are recalculated whenever a split is added or removed from an account, so YMMV on whether this should be set.
assume_orderedIf TRUE, assume that the splits in each transaction appear in the same order. This saves some time looking up splits by GncGUID, and is required for checking duplicated transactions because all the splits have new GUIDs.

Definition at line 875 of file Transaction.c.

880 {
881  gboolean same_book;
882 
883  if (!ta && !tb) return TRUE; /* Arguable. FALSE may be better. */
884 
885  if (!ta || !tb)
886  {
887  PINFO ("one is NULL");
888  return FALSE;
889  }
890 
891  if (ta == tb) return TRUE;
892 
893  same_book = qof_instance_get_book(QOF_INSTANCE(ta)) == qof_instance_get_book(QOF_INSTANCE(tb));
894 
895  if (check_guids)
896  {
897  if (qof_instance_guid_compare(ta, tb) != 0)
898  {
899  PINFO ("GUIDs differ");
900  return FALSE;
901  }
902  }
903 
904  if (!gnc_commodity_equal(ta->common_currency, tb->common_currency))
905  {
906  PINFO ("commodities differ %s vs %s",
907  gnc_commodity_get_unique_name (ta->common_currency),
908  gnc_commodity_get_unique_name (tb->common_currency));
909  return FALSE;
910  }
911 
912  if (ta->date_entered != tb->date_entered)
913  {
914  char buf1[100];
915  char buf2[100];
916 
917  (void)gnc_time64_to_iso8601_buff(ta->date_entered, buf1);
918  (void)gnc_time64_to_iso8601_buff(tb->date_entered, buf2);
919  PINFO ("date entered differs: '%s' vs '%s'", buf1, buf2);
920  return FALSE;
921  }
922 
923  if (ta->date_posted != tb->date_posted)
924  {
925  char buf1[100];
926  char buf2[100];
927 
928  (void)gnc_time64_to_iso8601_buff(ta->date_posted, buf1);
929  (void)gnc_time64_to_iso8601_buff(tb->date_posted, buf2);
930  PINFO ("date posted differs: '%s' vs '%s'", buf1, buf2);
931  return FALSE;
932  }
933 
934  /* If the same book, since we use cached strings, we can just compare pointer
935  * equality for num and description
936  */
937  if ((same_book && ta->num != tb->num) || (!same_book && g_strcmp0(ta->num, tb->num) != 0))
938  {
939  PINFO ("num differs: %s vs %s", ta->num, tb->num);
940  return FALSE;
941  }
942 
943  if ((same_book && ta->description != tb->description)
944  || (!same_book && g_strcmp0(ta->description, tb->description)))
945  {
946  PINFO ("descriptions differ: %s vs %s", ta->description, tb->description);
947  return FALSE;
948  }
949 
950  if (qof_instance_compare_kvp (QOF_INSTANCE (ta), QOF_INSTANCE (tb)) != 0)
951  {
952  char *frame_a;
953  char *frame_b;
954 
955  frame_a = qof_instance_kvp_as_string (QOF_INSTANCE (ta));
956  frame_b = qof_instance_kvp_as_string (QOF_INSTANCE (tb));
957 
958 
959  PINFO ("kvp frames differ:\n%s\n\nvs\n\n%s", frame_a, frame_b);
960 
961  g_free (frame_a);
962  g_free (frame_b);
963 
964  return FALSE;
965  }
966 
967  if (check_splits)
968  {
969  if ((!ta->splits && tb->splits) || (!tb->splits && ta->splits))
970  {
971  PINFO ("only one has splits");
972  return FALSE;
973  }
974 
975  if (ta->splits && tb->splits)
976  {
977  GList *node_a, *node_b;
978 
979  for (node_a = ta->splits, node_b = tb->splits;
980  node_a;
981  node_a = node_a->next, node_b = node_b->next)
982  {
983  Split *split_a = node_a->data;
984  Split *split_b;
985 
986  /* don't presume that the splits are in the same order */
987  if (!assume_ordered)
988  node_b = g_list_find_custom (tb->splits, split_a,
989  compare_split_guids);
990 
991  if (!node_b)
992  {
993  gchar guidstr[GUID_ENCODING_LENGTH+1];
994  guid_to_string_buff (xaccSplitGetGUID (split_a),guidstr);
995 
996  PINFO ("first has split %s and second does not",guidstr);
997  return FALSE;
998  }
999 
1000  split_b = node_b->data;
1001 
1002  if (!xaccSplitEqual (split_a, split_b, check_guids, check_balances,
1003  FALSE))
1004  {
1005  char str_a[GUID_ENCODING_LENGTH + 1];
1006  char str_b[GUID_ENCODING_LENGTH + 1];
1007 
1008  guid_to_string_buff (xaccSplitGetGUID (split_a), str_a);
1009  guid_to_string_buff (xaccSplitGetGUID (split_b), str_b);
1010 
1011  PINFO ("splits %s and %s differ", str_a, str_b);
1012  return FALSE;
1013  }
1014  }
1015 
1016  if (g_list_length (ta->splits) != g_list_length (tb->splits))
1017  {
1018  PINFO ("different number of splits");
1019  return FALSE;
1020  }
1021  }
1022  }
1023 
1024  return TRUE;
1025 }
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
#define PINFO(format, args...)
Print an informational note.
Definition: qoflog.h:256
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equal.
gchar * guid_to_string_buff(const GncGUID *guid, gchar *str)
The guid_to_string_buff() routine puts a null-terminated string encoding of the id into the memory po...
Definition: guid.cpp:174
gboolean xaccSplitEqual(const Split *sa, const Split *sb, gboolean check_guids, gboolean check_balances, gboolean check_txn_splits)
Equality.
Definition: Split.c:769
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
Definition: guid.h:84
#define xaccSplitGetGUID(X)
Definition: Split.h:554
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances.
const char * gnc_commodity_get_unique_name(const gnc_commodity *cm)
Retrieve the &#39;unique&#39; name for the specified commodity.
char * gnc_time64_to_iso8601_buff(time64 time, char *buff)
The gnc_time64_to_iso8601_buff() routine takes the input UTC time64 value and prints it as an ISO-860...
Definition: gnc-date.cpp:1142

◆ xaccTransGetAccountAmount()

gnc_numeric xaccTransGetAccountAmount ( const Transaction *  trans,
const Account account 
)

Same as xaccTransGetAccountValue, but uses the Account's commodity.

Definition at line 1205 of file Transaction.c.

1206 {
1207  gnc_numeric total = gnc_numeric_zero ();
1208  if (!trans || !acc) return total;
1209 
1210  total = gnc_numeric_convert (total, xaccAccountGetCommoditySCU (acc),
1212  FOR_EACH_SPLIT(trans, if (acc == xaccSplitGetAccount(s))
1213  total = gnc_numeric_add_fixed(
1214  total, xaccSplitGetAmount(s)));
1215  return total;
1216 }
int xaccAccountGetCommoditySCU(const Account *acc)
Return the SCU for the account.
Definition: Account.cpp:2701
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
Definition: gnc-numeric.h:166
gnc_numeric gnc_numeric_convert(gnc_numeric n, gint64 denom, gint how)
Change the denominator of a gnc_numeric value to the specified denominator under standard arguments &#39;...
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account&#39;s commodity.
Definition: gmock-Split.cpp:69

◆ xaccTransGetAccountBalance()

gnc_numeric xaccTransGetAccountBalance ( const Transaction *  trans,
const Account account 
)

Get the account balance for the specified account after the last split in the specified transaction.

Definition at line 1329 of file Transaction.c.

1331 {
1332  GList *node;
1333  Split *last_split = NULL;
1334 
1335  // Not really the appropriate error value.
1336  g_return_val_if_fail(account && trans, gnc_numeric_error(GNC_ERROR_ARG));
1337 
1338  for (node = trans->splits; node; node = node->next)
1339  {
1340  Split *split = node->data;
1341 
1342  if (!xaccTransStillHasSplit(trans, split))
1343  continue;
1344  if (xaccSplitGetAccount(split) != account)
1345  continue;
1346 
1347  if (!last_split)
1348  {
1349  last_split = split;
1350  continue;
1351  }
1352 
1353  /* This test needs to correspond to the comparison function used when
1354  sorting the splits for computing the running balance. */
1355  if (xaccSplitOrder (last_split, split) < 0)
1356  last_split = split;
1357  }
1358 
1359  return xaccSplitGetBalance (last_split);
1360 }
gint xaccSplitOrder(const Split *sa, const Split *sb)
The xaccSplitOrder(sa,sb) method is useful for sorting.
Definition: Split.c:1496
gnc_numeric xaccSplitGetBalance(const Split *s)
Returns the running balance up to and including the indicated split.
Definition: Split.c:1291
gnc_numeric gnc_numeric_error(GNCNumericErrorCode error_code)
Create a gnc_numeric object that signals the error condition noted by error_code, rather than a numbe...
Argument is not a valid number.
Definition: gnc-numeric.h:225
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53

◆ xaccTransGetAccountValue()

gnc_numeric xaccTransGetAccountValue ( const Transaction *  trans,
const Account account 
)

The xaccTransGetAccountValue() method returns the total value applied to a particular account.

In some cases there may be multiple Splits in a single Transaction applied to one account (in particular when trying to balance Lots) – this function is just a convenience to view everything at once.

Definition at line 1189 of file Transaction.c.

1191 {
1192  gnc_numeric total = gnc_numeric_zero ();
1193  if (!trans || !acc) return total;
1194 
1195  FOR_EACH_SPLIT(trans, if (acc == xaccSplitGetAccount(s))
1196 {
1197  total = gnc_numeric_add (total, xaccSplitGetValue (s),
1200  });
1201  return total;
1202 }
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
Use any denominator which gives an exactly correct ratio of numerator to denominator.
Definition: gnc-numeric.h:189
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction&#39;s commodity.
Definition: gmock-Split.cpp:84
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53
#define GNC_DENOM_AUTO
Values that can be passed as the &#39;denom&#39; argument.
Definition: gnc-numeric.h:246

◆ xaccTransGetAPARAcctSplitList()

SplitList* xaccTransGetAPARAcctSplitList ( const Transaction *  trans,
gboolean  strict 
)

The xaccTransGetAPARSplitList() method returns a GList of the splits in a transaction that belong to an AR or AP account.

Parameters
transThe transaction
strictThis slightly modifies the test to only consider splits in an AR or AP account and the split is part of a business lot
Returns
The list of splits. This list must be freed when you are done with it.

Definition at line 2341 of file Transaction.c.

2342 {
2343  GList *apar_splits = NULL;
2344  if (!trans) return NULL;
2345 
2346  FOR_EACH_SPLIT (trans,
2347  const Account *account = xaccSplitGetAccount(s);
2348  if (account && xaccAccountIsAPARType(xaccAccountGetType(account)))
2349  {
2350 
2351  if (!strict)
2352  apar_splits = g_list_prepend (apar_splits, s);
2353  else
2354  {
2355  GncOwner owner;
2356  GNCLot *lot = xaccSplitGetLot(s);
2357  if (lot &&
2358  (gncInvoiceGetInvoiceFromLot (lot) ||
2359  gncOwnerGetOwnerFromLot (lot, &owner)))
2360  apar_splits = g_list_prepend (apar_splits, s);
2361  }
2362  }
2363  );
2364 
2365  apar_splits = g_list_reverse (apar_splits);
2366  return apar_splits;
2367 }
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account&#39;s account type.
Definition: Account.cpp:3279
gboolean gncOwnerGetOwnerFromLot(GNCLot *lot, GncOwner *owner)
Get the owner from the lot.
Definition: gncOwner.c:637
gboolean xaccAccountIsAPARType(GNCAccountType t)
Convenience function to check if the account is a valid business account type (meaning an Accounts Pa...
Definition: Account.cpp:4667
GncInvoice * gncInvoiceGetInvoiceFromLot(GNCLot *lot)
Given a LOT, find and return the Invoice attached to the lot.
Definition: gncInvoice.c:1310
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53
GNCLot * xaccSplitGetLot(const Split *split)
Returns the pointer to the debited/credited Lot where this split belongs to, or NULL if it doesn&#39;t be...
Definition: Split.c:1877

◆ xaccTransGetCurrency()

gnc_commodity* xaccTransGetCurrency ( const Transaction *  trans)

Returns the valuation commodity of this transaction.

Each transaction's valuation commodity, or 'currency' is, by definition, the common currency in which all splits in the transaction can be valued. The total value of the transaction must be zero when all splits are valued in this currency.

Note
What happens if the Currency isn't set? Ans: bad things.

Definition at line 1367 of file Transaction.c.

1368 {
1369  return trans ? trans->common_currency : NULL;
1370 }

◆ xaccTransGetDate()

time64 xaccTransGetDate ( const Transaction *  trans)

Retrieve the posted date of the transaction.

The posted date is the date when this transaction was posted at the bank. (Although having different function names, GetDate and GetDatePosted refer to the same single date.)

Definition at line 73 of file gmock-Transaction.cpp.

74 {
75  SCOPED_TRACE("");
76  auto mocktrans = gnc_mocktransaction(trans);
77  return mocktrans ? mocktrans->get_date() : 0;
78 }

◆ xaccTransGetDateEntered()

time64 xaccTransGetDateEntered ( const Transaction *  trans)

Retrieve the date of when the transaction was entered.

The entered date is the date when the register entry was made.

Definition at line 2485 of file Transaction.c.

2486 {
2487  return trans ? trans->date_entered : 0;
2488 }

◆ xaccTransGetDatePostedGDate()

GDate xaccTransGetDatePostedGDate ( const Transaction *  trans)

Retrieve the posted date of the transaction.

The posted date is the date when this transaction was posted at the bank.

Definition at line 2498 of file Transaction.c.

2499 {
2500  GDate result;
2501  g_date_clear (&result, 1);
2502  if (trans)
2503  {
2504  /* Can we look up this value in the kvp slot? If yes, use it
2505  * from there because it doesn't suffer from time zone
2506  * shifts. */
2507  GValue v = G_VALUE_INIT;
2508  qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_DATE_POSTED);
2509  if (G_VALUE_HOLDS_BOXED (&v))
2510  result = *(GDate*)g_value_get_boxed (&v);
2511  g_value_unset (&v);
2512  if (! g_date_valid (&result) || gdate_to_time64 (result) == INT64_MAX)
2513  {
2514  /* Well, this txn doesn't have a valid GDate saved in a slot.
2515  * time64_to_gdate() uses local time and we want UTC so we have
2516  * to write it out.
2517  */
2518  time64 time = xaccTransGetDate(trans);
2519  struct tm *stm = gnc_gmtime(&time);
2520  if (stm)
2521  {
2522  g_date_set_dmy(&result, stm->tm_mday,
2523  (GDateMonth)(stm->tm_mon + 1),
2524  stm->tm_year + 1900);
2525  free(stm);
2526  }
2527  }
2528  }
2529  return result;
2530 }
time64 xaccTransGetDate(const Transaction *trans)
Retrieve the posted date of the transaction.
Definition: Transaction.c:2478
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.
time64 gdate_to_time64(GDate d)
Turns a GDate into a time64, returning the first second of the day.
Definition: gnc-date.cpp:1256
struct tm * gnc_gmtime(const time64 *secs)
fill out a time struct from a 64-bit time value
Definition: gnc-date.cpp:189
gint64 time64
Many systems, including Microsoft Windows and BSD-derived Unixes like Darwin, are retaining the int-3...
Definition: gnc-date.h:93

◆ xaccTransGetFirstAPARAcctSplit()

Split* xaccTransGetFirstAPARAcctSplit ( const Transaction *  trans,
gboolean  strict 
)

The xaccTransGetFirstPaymentAcctSplit() method returns a pointer to the first split in this transaction that belongs to an AR or AP account.

Parameters
transThe transaction
strictThis slightly modifies the test to only consider splits in an AR or AP account and the split is part of a business lot

If there is no such split in the transaction NULL will be returned.

Definition at line 2380 of file Transaction.c.

2381 {
2382  FOR_EACH_SPLIT (trans,
2383  const Account *account = xaccSplitGetAccount(s);
2384  if (account && xaccAccountIsAPARType(xaccAccountGetType(account)))
2385  {
2386  GNCLot *lot;
2387  GncOwner owner;
2388 
2389  if (!strict)
2390  return s;
2391 
2392  lot = xaccSplitGetLot(s);
2393  if (lot &&
2394  (gncInvoiceGetInvoiceFromLot (lot) ||
2395  gncOwnerGetOwnerFromLot (lot, &owner)))
2396  return s;
2397  }
2398  );
2399 
2400  return NULL;
2401 }
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account&#39;s account type.
Definition: Account.cpp:3279
gboolean gncOwnerGetOwnerFromLot(GNCLot *lot, GncOwner *owner)
Get the owner from the lot.
Definition: gncOwner.c:637
gboolean xaccAccountIsAPARType(GNCAccountType t)
Convenience function to check if the account is a valid business account type (meaning an Accounts Pa...
Definition: Account.cpp:4667
GncInvoice * gncInvoiceGetInvoiceFromLot(GNCLot *lot)
Given a LOT, find and return the Invoice attached to the lot.
Definition: gncInvoice.c:1310
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53
GNCLot * xaccSplitGetLot(const Split *split)
Returns the pointer to the debited/credited Lot where this split belongs to, or NULL if it doesn&#39;t be...
Definition: Split.c:1877

◆ xaccTransGetFirstPaymentAcctSplit()

Split* xaccTransGetFirstPaymentAcctSplit ( const Transaction *  trans)

The xaccTransGetFirstPaymentAcctSplit() method returns a pointer to the first split in this transaction that belongs to an account which is considered a valid account for business payments.

Parameters
transThe transaction

If there is no such split in the transaction NULL will be returned.

Definition at line 2369 of file Transaction.c.

2370 {
2371  FOR_EACH_SPLIT (trans,
2372  const Account *account = xaccSplitGetAccount(s);
2373  if (account && gncBusinessIsPaymentAcctType(xaccAccountGetType(account)))
2374  return s;
2375  );
2376 
2377  return NULL;
2378 }
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account&#39;s account type.
Definition: Account.cpp:3279
gboolean gncBusinessIsPaymentAcctType(GNCAccountType type)
Returns whether the given account type is a valid type to use in business payments.
Definition: gncBusiness.c:92
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53

◆ xaccTransGetImbalance()

MonetaryList* xaccTransGetImbalance ( const Transaction *  trans)

The xaccTransGetImbalance method returns a list giving the value of the transaction in each currency for which the balance is not zero.

If the use of currency accounts is disabled, then this will be only the common currency for the transaction and xaccTransGetImbalance becomes equivalent to xaccTransGetImbalanceValue. Otherwise it will return a list containing the imbalance in each currency.

Definition at line 1071 of file Transaction.c.

1072 {
1073  /* imbal_value is used if either (1) the transaction has a non currency
1074  split or (2) all the splits are in the same currency. If there are
1075  no non-currency splits and not all splits are in the same currency then
1076  imbal_list is used to compute the imbalance. */
1077  MonetaryList *imbal_list = NULL;
1078  gnc_numeric imbal_value = gnc_numeric_zero();
1079  gboolean trading_accts;
1080 
1081  if (!trans) return imbal_list;
1082 
1083  ENTER("(trans=%p)", trans);
1084 
1085  trading_accts = xaccTransUseTradingAccounts (trans);
1086 
1087  /* If using trading accounts and there is at least one split that is not
1088  in the transaction currency or a split that has a price or exchange
1089  rate other than 1, then compute the balance in each commodity in the
1090  transaction. Otherwise (all splits are in the transaction's currency)
1091  then compute the balance using the value fields.
1092 
1093  Optimize for the common case of only one currency and a balanced
1094  transaction. */
1095  FOR_EACH_SPLIT(trans,
1096  {
1097  gnc_commodity *commodity;
1099  if (trading_accts &&
1100  (imbal_list ||
1101  ! gnc_commodity_equiv(commodity, trans->common_currency) ||
1103  {
1104  /* Need to use (or already are using) a list of imbalances in each of
1105  the currencies used in the transaction. */
1106  if (! imbal_list)
1107  {
1108  /* All previous splits have been in the transaction's common
1109  currency, so imbal_value is in this currency. */
1110  imbal_list = gnc_monetary_list_add_value(imbal_list,
1111  trans->common_currency,
1112  imbal_value);
1113  }
1114  imbal_list = gnc_monetary_list_add_value(imbal_list, commodity,
1115  xaccSplitGetAmount(s));
1116  }
1117 
1118  /* Add it to the value accumulator in case we need it. */
1119  imbal_value = gnc_numeric_add(imbal_value, xaccSplitGetValue(s),
1121  } );
1122 
1123 
1124  if (!imbal_list && !gnc_numeric_zero_p(imbal_value))
1125  {
1126  /* Not balanced and no list, create one. If we found multiple currencies
1127  and no non-currency commodity then imbal_list will already exist and
1128  we won't get here. */
1129  imbal_list = gnc_monetary_list_add_value(imbal_list,
1130  trans->common_currency,
1131  imbal_value);
1132  }
1133 
1134  /* Delete all the zero entries from the list, perhaps leaving an
1135  empty list */
1136  imbal_list = gnc_monetary_list_delete_zeros(imbal_list);
1137 
1138  LEAVE("(trans=%p), imbal=%p", trans, imbal_list);
1139  return imbal_list;
1140 }
gboolean gnc_numeric_equal(gnc_numeric a, gnc_numeric b)
Equivalence predicate: Returns TRUE (1) if a and b represent the same number.
gboolean xaccTransUseTradingAccounts(const Transaction *trans)
Determine whether this transaction should use commodity trading accounts.
Definition: Transaction.c:1034
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
Use any denominator which gives an exactly correct ratio of numerator to denominator.
Definition: gnc-numeric.h:189
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
MonetaryList * gnc_monetary_list_delete_zeros(MonetaryList *list)
Delete all entries in the list that have zero value.
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction&#39;s commodity.
Definition: gmock-Split.cpp:84
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account&#39;s commodity.
Definition: Account.cpp:3448
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
#define GNC_DENOM_AUTO
Values that can be passed as the &#39;denom&#39; argument.
Definition: gnc-numeric.h:246
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equivalent.
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account&#39;s commodity.
Definition: gmock-Split.cpp:69

◆ xaccTransGetImbalanceValue()

gnc_numeric xaccTransGetImbalanceValue ( const Transaction *  trans)

The xaccTransGetImbalanceValue() method returns the total value of the transaction.

In a pure double-entry system, this imbalance should be exactly zero, and if it is not, something is broken. However, when double-entry semantics are not enforced, unbalanced transactions can sneak in, and this routine can be used to find out how much things are off by. The value returned is denominated in the currency that is returned by the xaccTransFindCommonCurrency() method.

If the use of currency exchange accounts is enabled then the a a transaction must be balanced in each currency it uses to be considered to be balanced. The method xaccTransGetImbalance is used by most code to take this into consideration. This method is only used in a few places that want the transaction value even if currency exchange accounts are enabled.

Definition at line 118 of file gmock-Transaction.cpp.

119 {
120  SCOPED_TRACE("");
121  auto mocktrans = gnc_mocktransaction(trans);
122  return mocktrans ? mocktrans->get_imbalance_value() : gnc_numeric_zero();
123 }

◆ xaccTransGetNotes()

const char* xaccTransGetNotes ( const Transaction *  trans)

Gets the transaction Notes.

The Notes field is only visible in the register in double-line mode

Definition at line 103 of file gmock-Transaction.cpp.

104 {
105  SCOPED_TRACE("");
106  auto mocktrans = gnc_mocktransaction(trans);
107  return mocktrans ? mocktrans->get_notes() : "";
108 }

◆ xaccTransGetPaymentAcctSplitList()

SplitList* xaccTransGetPaymentAcctSplitList ( const Transaction *  trans)

The xaccTransGetPaymentAcctSplitList() method returns a GList of the splits in a transaction that belong to an account which is considered a valid account for business payments.

Parameters
transThe transaction
Returns
The list of splits. This list must be freed when you are done with it.

Definition at line 2327 of file Transaction.c.

2328 {
2329  GList *pay_splits = NULL;
2330  FOR_EACH_SPLIT (trans,
2331  const Account *account = xaccSplitGetAccount(s);
2332  if (account && gncBusinessIsPaymentAcctType(xaccAccountGetType(account)))
2333  pay_splits = g_list_prepend (pay_splits, s);
2334  );
2335 
2336  pay_splits = g_list_reverse (pay_splits);
2337  return pay_splits;
2338 }
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account&#39;s account type.
Definition: Account.cpp:3279
gboolean gncBusinessIsPaymentAcctType(GNCAccountType type)
Returns whether the given account type is a valid type to use in business payments.
Definition: gncBusiness.c:92
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53

◆ xaccTransGetReadOnly()

const char* xaccTransGetReadOnly ( Transaction *  trans)

Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text.

Definition at line 2596 of file Transaction.c.

2597 {
2598  if (!trans)
2599  return NULL;
2600 
2601  if (trans->readonly_reason == is_unset)
2602  {
2603  GValue v = G_VALUE_INIT;
2604  qof_instance_get_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_READ_ONLY_REASON);
2605  trans->readonly_reason = G_VALUE_HOLDS_STRING (&v) ?
2606  g_value_dup_string (&v) : NULL;
2607  g_value_unset (&v);
2608  }
2609  return trans->readonly_reason;
2610 }
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.

◆ xaccTransGetReversedBy()

Transaction* xaccTransGetReversedBy ( const Transaction *  trans)

Returns the transaction that reversed the given transaction.

Parameters
transa Transaction that has been reversed
Returns
the transaction that reversed the given transaction, or NULL if the given transaction has not been reversed.

Definition at line 2937 of file Transaction.c.

2938 {
2939  GValue v = G_VALUE_INIT;
2940  Transaction *retval = NULL;
2941  g_return_val_if_fail(trans, NULL);
2942  qof_instance_get_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_REVERSED_BY);
2943  if (G_VALUE_HOLDS_BOXED (&v))
2944  {
2945  GncGUID* guid = g_value_get_boxed (&v);
2946  retval = xaccTransLookup(guid, qof_instance_get_book (trans));
2947  }
2948  g_value_unset (&v);
2949  return retval;
2950 }
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.
Transaction * xaccTransLookup(const GncGUID *guid, QofBook *book)
The xaccTransLookup() subroutine will return the transaction associated with the given id...
Definition: Transaction.c:1043
The type used to store guids in C.
Definition: guid.h:75

◆ xaccTransGetSplit()

Split* xaccTransGetSplit ( const Transaction *  trans,
int  i 
)

Return a pointer to the indexed split in this transaction's split list.

Note that the split list is a linked list and that indexed access is O(N). Do not use this method for iteration.

Parameters
transThe transaction
iThe split number. Valid values for i are zero to (number_of__splits-1).
Returns
A Split* or NULL if i is out of range.

Definition at line 49 of file gmock-Transaction.cpp.

50 {
51  SCOPED_TRACE("");
52  auto mocktrans = gnc_mocktransaction(trans);
53  return mocktrans ? mocktrans->get_split(i) : nullptr;
54 }

◆ xaccTransGetSplitList()

SplitList* xaccTransGetSplitList ( const Transaction *  trans)

The xaccTransGetSplitList() method returns a GList of the splits in a transaction.

Parameters
transThe transaction
Returns
The list of splits. This list must NOT be modified. Do NOT free this list when you are done with it.

Definition at line 57 of file gmock-Transaction.cpp.

58 {
59  g_return_val_if_fail(GNC_IS_MOCKTRANSACTION(trans), NULL);
60  return trans ? ((MockTransaction*)trans)->get_split_list() : NULL;
61 }

◆ xaccTransGetTxnType()

char xaccTransGetTxnType ( Transaction *  trans)

Returns the Transaction Type: note this type will be derived from the transaction splits, returning TXN_TYPE_NONE, TXN_TYPE_INVOICE, TXN_TYPE_LINK, or TXN_TYPE_PAYMENT according to heuristics.

It does not query the transaction kvp slots.

See TXN_TYPE_NONE, TXN_TYPE_INVOICE and TXN_TYPE_PAYMENT

Definition at line 2556 of file Transaction.c.

2557 {
2558  gboolean has_nonAPAR_amount = FALSE;
2559 
2560  if (!trans) return TXN_TYPE_NONE;
2561 
2562  if (trans->txn_type != TXN_TYPE_UNCACHED)
2563  return trans->txn_type;
2564 
2565  trans->txn_type = TXN_TYPE_NONE;
2566  for (GList *n = xaccTransGetSplitList (trans); n; n = g_list_next (n))
2567  {
2568  Account *acc = xaccSplitGetAccount (n->data);
2569 
2570  if (!acc)
2571  continue;
2572 
2575  has_nonAPAR_amount = TRUE;
2576  else if (trans->txn_type == TXN_TYPE_NONE)
2577  {
2578  GNCLot *lot = xaccSplitGetLot (n->data);
2579  GncInvoice *invoice = gncInvoiceGetInvoiceFromLot (lot);
2580  GncOwner owner;
2581 
2582  if (invoice && trans == gncInvoiceGetPostedTxn (invoice))
2583  trans->txn_type = TXN_TYPE_INVOICE;
2584  else if (invoice || gncOwnerGetOwnerFromLot (lot, &owner))
2585  trans->txn_type = TXN_TYPE_PAYMENT;
2586  }
2587  }
2588 
2589  if (!has_nonAPAR_amount && (trans->txn_type == TXN_TYPE_PAYMENT))
2590  trans->txn_type = TXN_TYPE_LINK;
2591 
2592  return trans->txn_type;
2593 }
#define TXN_TYPE_INVOICE
Transaction is an invoice.
Definition: Transaction.h:126
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account&#39;s account type.
Definition: Account.cpp:3279
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
#define TXN_TYPE_NONE
No transaction type.
Definition: Transaction.h:125
gboolean gncOwnerGetOwnerFromLot(GNCLot *lot, GncOwner *owner)
Get the owner from the lot.
Definition: gncOwner.c:637
gboolean xaccAccountIsAPARType(GNCAccountType t)
Convenience function to check if the account is a valid business account type (meaning an Accounts Pa...
Definition: Account.cpp:4667
#define TXN_TYPE_LINK
Transaction is a link between (invoice and payment) lots.
Definition: Transaction.h:128
#define TXN_TYPE_PAYMENT
Transaction is a payment.
Definition: Transaction.h:127
GncInvoice * gncInvoiceGetInvoiceFromLot(GNCLot *lot)
Given a LOT, find and return the Invoice attached to the lot.
Definition: gncInvoice.c:1310
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction&#39;s commodity.
Definition: gmock-Split.cpp:84
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53
SplitList * xaccTransGetSplitList(const Transaction *trans)
The xaccTransGetSplitList() method returns a GList of the splits in a transaction.
Definition: Transaction.c:2321
GNCLot * xaccSplitGetLot(const Split *split)
Returns the pointer to the debited/credited Lot where this split belongs to, or NULL if it doesn&#39;t be...
Definition: Split.c:1877

◆ xaccTransGetVoidReason()

const char* xaccTransGetVoidReason ( const Transaction *  transaction)

Returns the user supplied textual reason why a transaction was voided.

Parameters
transactionThe transaction in question.
Returns
A pointer to the user supplied reason for voiding.

Definition at line 2835 of file Transaction.c.

2836 {
2837  g_return_val_if_fail (trans, NULL);
2838  if (trans->void_reason == is_unset)
2839  {
2840  GValue v = G_VALUE_INIT;
2841  Transaction *t = (Transaction*) trans;
2842  qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, void_reason_str);
2843  t->void_reason = G_VALUE_HOLDS_STRING (&v) ? g_value_dup_string (&v) : NULL;
2844  g_value_unset (&v);
2845  }
2846  return trans->void_reason;
2847 }
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.

◆ xaccTransGetVoidStatus()

gboolean xaccTransGetVoidStatus ( const Transaction *  transaction)

Retrieve information on whether or not a transaction has been voided.

Parameters
transactionThe transaction in question.
Returns
TRUE if the transaction is void, FALSE otherwise. Also returns FALSE upon an error.

Definition at line 2828 of file Transaction.c.

2829 {
2830  const char *s = xaccTransGetVoidReason (trans);
2831  return (s && *s);
2832 }
const char * xaccTransGetVoidReason(const Transaction *trans)
Returns the user supplied textual reason why a transaction was voided.
Definition: Transaction.c:2835

◆ xaccTransGetVoidTime()

time64 xaccTransGetVoidTime ( const Transaction *  tr)

Returns the time that a transaction was voided.

Parameters
trThe transaction in question.
Returns
A time64 containing the time that this transaction was voided. Returns a time of zero upon error.

Definition at line 2850 of file Transaction.c.

2851 {
2852  GValue v = G_VALUE_INIT;
2853  const char *s = NULL;
2854  time64 void_time = 0;
2855 
2856  g_return_val_if_fail(tr, void_time);
2857  qof_instance_get_kvp (QOF_INSTANCE (tr), &v, 1, void_time_str);
2858  if (G_VALUE_HOLDS_STRING (&v))
2859  {
2860  s = g_value_get_string (&v);
2861  if (s)
2862  void_time = gnc_iso8601_to_time64_gmt (s);
2863  }
2864  g_value_unset (&v);
2865  return void_time;
2866 }
time64 gnc_iso8601_to_time64_gmt(const gchar *)
The gnc_iso8601_to_time64_gmt() routine converts an ISO-8601 style date/time string to time64...
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.
gint64 time64
Many systems, including Microsoft Windows and BSD-derived Unixes like Darwin, are retaining the int-3...
Definition: gnc-date.h:93

◆ xaccTransIsBalanced()

gboolean xaccTransIsBalanced ( const Transaction *  trans)

Returns true if the transaction is balanced according to the rules currently in effect.

Definition at line 1143 of file Transaction.c.

1144 {
1145  MonetaryList *imbal_list;
1146  gboolean result;
1147  gnc_numeric imbal = gnc_numeric_zero();
1148  gnc_numeric imbal_trading = gnc_numeric_zero();
1149 
1150  if (trans == NULL) return FALSE;
1151 
1152  if (xaccTransUseTradingAccounts(trans))
1153  {
1154  /* Transaction is imbalanced if the value is imbalanced in either
1155  trading or non-trading splits. One can't be used to balance
1156  the other. */
1157  FOR_EACH_SPLIT(trans,
1158  {
1159  Account *acc = xaccSplitGetAccount(s);
1160  if (!acc || xaccAccountGetType(acc) != ACCT_TYPE_TRADING)
1161  {
1162  imbal = gnc_numeric_add(imbal, xaccSplitGetValue(s),
1164  }
1165  else
1166  {
1167  imbal_trading = gnc_numeric_add(imbal_trading, xaccSplitGetValue(s),
1169  }
1170  }
1171  );
1172  }
1173  else
1174  imbal = xaccTransGetImbalanceValue(trans);
1175 
1176  if (! gnc_numeric_zero_p(imbal) || ! gnc_numeric_zero_p(imbal_trading))
1177  return FALSE;
1178 
1179  if (!xaccTransUseTradingAccounts (trans))
1180  return TRUE;
1181 
1182  imbal_list = xaccTransGetImbalance(trans);
1183  result = imbal_list == NULL;
1184  gnc_monetary_list_free(imbal_list);
1185  return result;
1186 }
gboolean xaccTransUseTradingAccounts(const Transaction *trans)
Determine whether this transaction should use commodity trading accounts.
Definition: Transaction.c:1034
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account&#39;s account type.
Definition: Account.cpp:3279
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
Use any denominator which gives an exactly correct ratio of numerator to denominator.
Definition: gnc-numeric.h:189
Account used to record multiple commodity transactions.
Definition: Account.h:161
gnc_numeric xaccTransGetImbalanceValue(const Transaction *trans)
The xaccTransGetImbalanceValue() method returns the total value of the transaction.
Definition: Transaction.c:1055
void gnc_monetary_list_free(MonetaryList *list)
Free a MonetaryList and all the monetaries it points to.
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction&#39;s commodity.
Definition: gmock-Split.cpp:84
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
Definition: gmock-Split.cpp:53
MonetaryList * xaccTransGetImbalance(const Transaction *trans)
The xaccTransGetImbalance method returns a list giving the value of the transaction in each currency ...
Definition: Transaction.c:1071
#define GNC_DENOM_AUTO
Values that can be passed as the &#39;denom&#39; argument.
Definition: gnc-numeric.h:246

◆ xaccTransIsOpen()

gboolean xaccTransIsOpen ( const Transaction *  trans)

The xaccTransIsOpen() method returns TRUE if the transaction is open for editing.

Otherwise, it returns false. XXX this routine should probably be deprecated. its, umm, hard to imagine legitimate uses (but it is used by the import/export code for reasons I can't understand.)

Definition at line 134 of file gmock-Transaction.cpp.

135 {
136  SCOPED_TRACE("");
137  auto mocktrans = gnc_mocktransaction(trans);
138  return mocktrans ? mocktrans->is_open() : FALSE;
139 }

◆ xaccTransIsReadonlyByPostedDate()

gboolean xaccTransIsReadonlyByPostedDate ( const Transaction *  trans)

Returns TRUE if this Transaction is read-only because its posted-date is older than the "auto-readonly" threshold of this book.

See qof_book_uses_autofreeze() and qof_book_get_autofreeze_gdate().

Definition at line 2635 of file Transaction.c.

2636 {
2637  GDate *threshold_date;
2638  GDate trans_date;
2639  const QofBook *book = xaccTransGetBook (trans);
2640  gboolean result;
2641  g_assert(trans);
2642 
2643  if (!qof_book_uses_autoreadonly(book))
2644  {
2645  return FALSE;
2646  }
2647 
2648  if (xaccTransIsSXTemplate (trans))
2649  return FALSE;
2650 
2651  threshold_date = qof_book_get_autoreadonly_gdate(book);
2652  g_assert(threshold_date); // ok because we checked uses_autoreadonly before
2653  trans_date = xaccTransGetDatePostedGDate(trans);
2654 
2655 // g_warning("there is auto-read-only with days=%d, trans_date_day=%d, threshold_date_day=%d",
2656 // qof_book_get_num_days_autofreeze(book),
2657 // g_date_get_day(&trans_date),
2658 // g_date_get_day(threshold_date));
2659 
2660  if (g_date_compare(&trans_date, threshold_date) < 0)
2661  {
2662  //g_warning("we are auto-read-only");
2663  result = TRUE;
2664  }
2665  else
2666  {
2667  result = FALSE;
2668  }
2669  g_date_free(threshold_date);
2670  return result;
2671 }
GDate * qof_book_get_autoreadonly_gdate(const QofBook *book)
Returns the GDate that is the threshold for auto-read-only.
Definition: qofbook.cpp:994
#define xaccTransGetBook(X)
Definition: Transaction.h:791
gboolean qof_book_uses_autoreadonly(const QofBook *book)
Returns TRUE if the auto-read-only feature should be used, otherwise FALSE.
Definition: qofbook.cpp:968
GDate xaccTransGetDatePostedGDate(const Transaction *trans)
Retrieve the posted date of the transaction.
Definition: Transaction.c:2498

◆ xaccTransLookup()

Transaction* xaccTransLookup ( const GncGUID guid,
QofBook *  book 
)

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

Definition at line 1043 of file Transaction.c.

1044 {
1045  QofCollection *col;
1046  if (!guid || !book) return NULL;
1047  col = qof_book_get_collection (book, GNC_ID_TRANS);
1048  return (Transaction *) qof_collection_lookup_entity (col, guid);
1049 }
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:532

◆ xaccTransOrder()

int xaccTransOrder ( const Transaction *  ta,
const Transaction *  tb 
)

The xaccTransOrder(ta,tb) method is useful for sorting.

Orders ta and tb return <0 if ta sorts before tb return >0 if ta sorts after tb return 0 if they are absolutely equal

The comparrison uses the following fields, in order: date posted (compare as a date) num field (compare as an integer) date entered (compare as a date) description field (comcpare as a string using strcmp()) GncGUID (compare as a guid) Finally, it returns zero if all of the above match. Note that it does NOT compare its member splits. Note also that it calls xaccTransOrder_num_action with actna and actnb set as NULL.

Definition at line 1896 of file Transaction.c.

1897 {
1898  return xaccTransOrder_num_action (ta, NULL, tb, NULL);
1899 }
int xaccTransOrder_num_action(const Transaction *ta, const char *actna, const Transaction *tb, const char *actnb)
The xaccTransOrder_num_action(ta,actna,tb,actnb) method is useful for sorting.
Definition: Transaction.c:1932

◆ xaccTransOrder_num_action()

int xaccTransOrder_num_action ( const Transaction *  ta,
const char *  actna,
const Transaction *  tb,
const char *  actnb 
)

The xaccTransOrder_num_action(ta,actna,tb,actnb) method is useful for sorting.

Orders ta and tb return <0 if ta sorts before tb return >0 if ta sorts after tb return 0 if they are absolutely equal

The comparrison uses the following fields, in order: date posted (compare as a date) if actna and actnb are NULL, num field (compare as an integer) else actna and actnb (compare as an integer) date entered (compare as a date) description field (comcpare as a string using strcmp()) GncGUID (compare as a guid) Finally, it returns zero if all of the above match. Note that it does NOT compare its member splits (except action as specified above).

Definition at line 1932 of file Transaction.c.

1934 {
1935  const char *da, *db;
1936  int retval;
1937  int64_t na, nb;
1938 
1939  if ( ta && !tb ) return -1;
1940  if ( !ta && tb ) return +1;
1941  if ( !ta && !tb ) return 0;
1942 
1943  if (ta->date_posted != tb->date_posted)
1944  return (ta->date_posted > tb->date_posted) - (ta->date_posted < tb->date_posted);
1945 
1946  /* Always sort closing transactions after normal transactions */
1947  {
1948  gboolean ta_is_closing = xaccTransGetIsClosingTxn (ta);
1949  gboolean tb_is_closing = xaccTransGetIsClosingTxn (tb);
1950  if (ta_is_closing != tb_is_closing)
1951  return (ta_is_closing - tb_is_closing);
1952  }
1953 
1954  /* otherwise, sort on number string */
1955  if (actna && actnb) /* split action string, if not NULL */
1956  {
1957  retval = order_by_int64_or_string (actna, actnb);
1958  }
1959  else /* else transaction num string */
1960  {
1961  retval = order_by_int64_or_string (ta->num, tb->num);
1962  }
1963  if (retval)
1964  return retval;
1965 
1966  if (ta->date_entered != tb->date_entered)
1967  return (ta->date_entered > tb->date_entered) - (ta->date_entered < tb->date_entered);
1968 
1969  /* otherwise, sort on description string */
1970  da = ta->description ? ta->description : "";
1971  db = tb->description ? tb->description : "";
1972  retval = g_utf8_collate (da, db);
1973  if (retval)
1974  return retval;
1975 
1976  /* else, sort on guid - keeps sort stable. */
1977  return qof_instance_guid_compare(ta, tb);
1978 }
gboolean xaccTransGetIsClosingTxn(const Transaction *trans)
Returns whether this transaction is a "closing transaction".
Definition: Transaction.c:2455
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances.

◆ xaccTransRecordPrice()

void xaccTransRecordPrice ( Transaction *  trans,
PriceSource  source 
)

The xaccTransRecordPrice() method iterates through the splits and and record the non-currency equivalent prices in the price database.

Parameters
transThe transaction whose price is recorded
sourceThe price priority level

Definition at line 149 of file gmock-Transaction.cpp.

150 {
151  g_return_if_fail(GNC_IS_MOCKTRANSACTION(trans));
152  ((MockTransaction*)trans)->recordPrice();
153 }

◆ xaccTransRetDateEntered()

time64 xaccTransRetDateEntered ( const Transaction *  trans)

Retrieve the date of when the transaction was entered.

The entered date is the date when the register entry was made.

Definition at line 2533 of file Transaction.c.

2534 {
2535  return trans ? trans->date_entered : 0;
2536 }

◆ xaccTransRetDatePosted()

time64 xaccTransRetDatePosted ( const Transaction *  trans)

Retrieve the posted date of the transaction.

The posted date is the date when this transaction was posted at the bank. (Although having different function names, GetDate and GetDatePosted refer to the same single date.)

Definition at line 2492 of file Transaction.c.

2493 {
2494  return trans ? trans->date_posted : 0;
2495 }

◆ xaccTransReverse()

Transaction* xaccTransReverse ( Transaction *  transaction)

xaccTransReverse creates a Transaction that reverses the given transaction by inverting all the numerical values in the given transaction.

This function cancels out the effect of an earlier transaction. This will be needed by write only accounts as a way to void a previous transaction (since you can't alter the existing transaction).

Parameters
transactionThe transaction to create a reverse of.
Returns
a new transaction which reverses the given transaction

Definition at line 2897 of file Transaction.c.

2898 {
2899  Transaction *trans;
2900  GValue v = G_VALUE_INIT;
2901  g_return_val_if_fail(orig, NULL);
2902 
2903  /* First edit, dirty, and commit orig to ensure that any trading
2904  * splits are correctly balanced.
2905  */
2906  xaccTransBeginEdit (orig);
2907  qof_instance_set_dirty (QOF_INSTANCE (orig));
2908  xaccTransCommitEdit (orig);
2909 
2910  trans = xaccTransClone(orig);
2911  g_return_val_if_fail (trans, NULL);
2912  xaccTransBeginEdit(trans);
2913 
2914  /* Reverse the values on each split. Clear per-split info. */
2915  FOR_EACH_SPLIT(trans,
2916  {
2920  });
2921 
2922  /* Now update the original with a pointer to the new one */
2923  g_value_init (&v, GNC_TYPE_GUID);
2924  g_value_set_boxed (&v, xaccTransGetGUID(trans));
2925  qof_instance_set_kvp (QOF_INSTANCE (orig), &v, 1, TRANS_REVERSED_BY);
2926  g_value_unset (&v);
2927 
2928  /* Make sure the reverse transaction is not read-only */
2929  xaccTransClearReadOnly(trans);
2930 
2931  qof_instance_set_dirty(QOF_INSTANCE(trans));
2932  xaccTransCommitEdit(trans);
2933  return trans;
2934 }
void xaccSplitSetValue(Split *split, gnc_numeric val)
The xaccSplitSetValue() method sets the value of this split in the transaction&#39;s commodity.
Definition: gmock-Split.cpp:92
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue.
gnc_numeric gnc_numeric_neg(gnc_numeric a)
Returns a newly created gnc_numeric that is the negative of the given gnc_numeric value...
void xaccSplitSetReconcile(Split *split, char recn)
Set the reconcile flag.
void xaccSplitSetAmount(Split *split, gnc_numeric amt)
The xaccSplitSetAmount() method sets the amount in the account&#39;s commodity that the split should have...
Definition: gmock-Split.cpp:77
Transaction * xaccTransClone(const Transaction *from)
The xaccTransClone() method will create a complete copy of an existing transaction.
Definition: Transaction.c:682
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
Definition: Transaction.c:1654
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
Definition: Transaction.c:1455
#define xaccTransGetGUID(X)
Definition: Transaction.h:793
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction&#39;s commodity.
Definition: gmock-Split.cpp:84
#define NREC
not reconciled or cleared
Definition: Split.h:74
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account&#39;s commodity.
Definition: gmock-Split.cpp:69

◆ xaccTransRollbackEdit()

void xaccTransRollbackEdit ( Transaction *  trans)

The xaccTransRollbackEdit() routine rejects all edits made, and sets the transaction back to where it was before the editing started.

This includes restoring any deleted splits, removing any added splits, and undoing the effects of xaccTransDestroy, as well as restoring share quantities, memos, descriptions, etc.

Todo:
Fix transrollbackedit in QOF so that rollback is exposed via the API.

Definition at line 1730 of file Transaction.c.

1731 {
1732  GList *node, *onode;
1733  QofBackend *be;
1734  Transaction *orig;
1735  GList *slist;
1736  int num_preexist, i;
1737 
1738 /* FIXME: This isn't quite the right way to handle nested edits --
1739  * there should be a stack of transaction states that are popped off
1740  * and restored at each level -- but it does prevent restoring to the
1741  * editlevel 0 state until one is returning to editlevel 0, and
1742  * thereby prevents a crash caused by trans->orig getting NULLed too
1743  * soon.
1744  */
1745  if (!qof_instance_get_editlevel (QOF_INSTANCE (trans))) return;
1746  if (qof_instance_get_editlevel (QOF_INSTANCE (trans)) > 1) {
1747  qof_instance_decrease_editlevel (QOF_INSTANCE (trans));
1748  return;
1749  }
1750 
1751  ENTER ("trans addr=%p\n", trans);
1752 
1753  check_open(trans);
1754 
1755  /* copy the original values back in. */
1756 
1757  orig = trans->orig;
1758  SWAP_STR(trans->num, orig->num);
1759  SWAP_STR(trans->description, orig->description);
1760  trans->date_entered = orig->date_entered;
1761  trans->date_posted = orig->date_posted;
1762  SWAP(trans->common_currency, orig->common_currency);
1763  qof_instance_swap_kvp (QOF_INSTANCE (trans), QOF_INSTANCE (orig));
1764 
1765  /* The splits at the front of trans->splits are exactly the same
1766  splits as in the original, but some of them may have changed, so
1767  we restore only those. */
1768 /* FIXME: Runs off the transaction's splits, so deleted splits are not
1769  * restored!
1770  */
1771  num_preexist = g_list_length(orig->splits);
1772  slist = g_list_copy(trans->splits);
1773  for (i = 0, node = slist, onode = orig->splits; node;
1774  i++, node = node->next, onode = onode ? onode->next : NULL)
1775  {
1776  Split *s = node->data;
1777 
1778  if (!qof_instance_is_dirty(QOF_INSTANCE(s)))
1779  continue;
1780 
1781  if (i < num_preexist && onode)
1782  {
1783  Split *so = onode->data;
1784 
1785  xaccSplitRollbackEdit(s);
1786  SWAP_STR(s->action, so->action);
1787  SWAP_STR(s->memo, so->memo);
1788  qof_instance_copy_kvp (QOF_INSTANCE (s), QOF_INSTANCE (so));
1789  s->reconciled = so->reconciled;
1790  s->amount = so->amount;
1791  s->value = so->value;
1792  s->lot = so->lot;
1793  s->gains_split = so->gains_split;
1794  //SET_GAINS_A_VDIRTY(s);
1795  s->date_reconciled = so->date_reconciled;
1796  qof_instance_mark_clean(QOF_INSTANCE(s));
1797  xaccFreeSplit(so);
1798  }
1799  else
1800  {
1801  /* Potentially added splits */
1802  if (trans != xaccSplitGetParent(s))
1803  {
1804  trans->splits = g_list_remove(trans->splits, s);
1805  /* New split added, but then moved to another
1806  transaction */
1807  continue;
1808  }
1809  xaccSplitRollbackEdit(s);
1810  trans->splits = g_list_remove(trans->splits, s);
1811  g_assert(trans != xaccSplitGetParent(s));
1812  /* NB: our memory management policy here is that a new split
1813  added to the transaction which is then rolled-back still
1814  belongs to the engine. Specifically, it's freed by the
1815  transaction to which it was added. Don't add the Split to
1816  more than one transaction during the begin/commit block! */
1817  if (NULL == xaccSplitGetParent(s))
1818  {
1819  xaccFreeSplit(s); // a newly malloc'd split
1820  }
1821  }
1822  }
1823  g_list_free(slist);
1824  g_list_free(orig->splits);
1825  orig->splits = NULL;
1826 
1827  /* Now that the engine copy is back to its original version,
1828  * get the backend to fix it in the database */
1832  if (qof_backend_can_rollback (be))
1833  {
1834  QofBackendError errcode;
1835 
1836  /* clear errors */
1837  do
1838  {
1839  errcode = qof_backend_get_error (be);
1840  }
1841  while (ERR_BACKEND_NO_ERR != errcode);
1842 
1843  qof_backend_rollback_instance (be, &(trans->inst));
1844 
1845  errcode = qof_backend_get_error (be);
1846  if (ERR_BACKEND_MOD_DESTROY == errcode)
1847  {
1848  /* The backend is asking us to delete this transaction.
1849  * This typically happens because another (remote) user
1850  * has deleted this transaction, and we haven't found
1851  * out about it until this user tried to edit it.
1852  */
1853  xaccTransDestroy (trans);
1854  do_destroy (trans);
1855 
1856  /* push error back onto the stack */
1857  qof_backend_set_error (be, errcode);
1858  LEAVE ("deleted trans addr=%p\n", trans);
1859  return;
1860  }
1861  if (ERR_BACKEND_NO_ERR != errcode)
1862  {
1863  PERR ("Rollback Failed. Ouch!");
1864  /* push error back onto the stack */
1865  qof_backend_set_error (be, errcode);
1866  }
1867  }
1868 
1870  xaccTransWriteLog (trans, 'R');
1871 
1872  xaccFreeTransaction (trans->orig);
1873 
1874  trans->orig = NULL;
1875  qof_instance_set_destroying(trans, FALSE);
1876 
1877  /* Put back to zero. */
1878  qof_instance_decrease_editlevel(trans);
1879  /* FIXME: The register code seems to depend on the engine to
1880  generate an event during rollback, even though the state is just
1881  reverting to what it was. */
1882  gen_event_trans (trans);
1883 
1884  LEAVE ("trans addr=%p\n", trans);
1885 }
commit of object update failed because another user has deleted the object
Definition: qofbackend.h:77
#define qof_instance_is_dirty
Return value of is_dirty flag.
Definition: qofinstance.h:162
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
QofBackendError
The errors that can be reported to the GUI & other front-end users.
Definition: qofbackend.h:57
void xaccTransWriteLog(Transaction *trans, char flag)
Definition: TransLog.c:223
void qof_backend_set_error(QofBackend *qof_be, QofBackendError err)
Set the error on the specified QofBackend.
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split.
#define PERR(format, args...)
Log a serious error.
Definition: qoflog.h:244
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
QofBackendError qof_backend_get_error(QofBackend *qof_be)
Get the last backend error.
void xaccTransDestroy(Transaction *trans)
Destroys a transaction.
Definition: Transaction.c:1477
gboolean qof_book_is_readonly(const QofBook *book)
Return whether the book is read only.
Definition: qofbook.cpp:508
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
QofBackend * qof_book_get_backend(const QofBook *book)
Retrieve the backend used by this book.
Definition: qofbook.cpp:452

◆ xaccTransScrubGains()

void xaccTransScrubGains ( Transaction *  trans,
Account gain_acc 
)

The xaccTransScrubGains() routine performs a number of cleanup functions on the indicated transaction, with the end-goal of setting up a consistent set of gains/losses for all the splits in the transaction.

This includes making sure that the lot assignments of all the splits are good, and that the lots balance appropriately.

Definition at line 3010 of file Transaction.c.

3011 {
3012  SplitList *node;
3013 
3014  ENTER("(trans=%p)", trans);
3015  /* Lock down posted date, its to be synced to the posted date
3016  * for the source of the cap gains. */
3017  xaccTransScrubGainsDate(trans);
3018 
3019  /* Fix up the split amount */
3020 restart:
3021  for (node = trans->splits; node; node = node->next)
3022  {
3023  Split *s = node->data;
3024 
3025  if (!xaccTransStillHasSplit(trans, s)) continue;
3026 
3027  xaccSplitDetermineGainStatus(s);
3028  if (s->gains & GAINS_STATUS_ADIRTY)
3029  {
3030  gboolean altered = FALSE;
3031  s->gains &= ~GAINS_STATUS_ADIRTY;
3032  if (s->lot)
3033  altered = xaccScrubLot(s->lot);
3034  else
3035  altered = xaccSplitAssign(s);
3036  if (altered) goto restart;
3037  }
3038  }
3039 
3040  /* Fix up gains split value */
3041  FOR_EACH_SPLIT(trans,
3042  if ((s->gains & GAINS_STATUS_VDIRTY) ||
3043  (s->gains_split &&
3044  (s->gains_split->gains & GAINS_STATUS_VDIRTY)))
3045  xaccSplitComputeCapGains(s, gain_acc);
3046  );
3047 
3048  LEAVE("(trans=%p)", trans);
3049 }
void xaccSplitComputeCapGains(Split *split, Account *gain_acc)
The xaccSplitComputeCapGains() routine computes the cap gains or losses for the indicated split...
Definition: cap-gains.c:528
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
GList SplitList
GList of Split.
Definition: gnc-engine.h:211
gboolean xaccSplitAssign(Split *split)
The`xaccSplitAssign() routine will take the indicated split and, if it doesn&#39;t already belong to a lo...
Definition: cap-gains.c:428
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
gboolean xaccScrubLot(GNCLot *lot)
The xaccScrubLot() routine makes sure that the indicated lot is self-consistent and properly balanced...
Definition: Scrub3.c:85

◆ xaccTransSetCurrency()

void xaccTransSetCurrency ( Transaction *  trans,
gnc_commodity *  curr 
)

Set the commodity of this transaction.

Set the commodity of this transaction.

When we do that to a transaction with splits we need to re-value all of the splits in the new currency.

Parameters
transThe transaction to change
currThe new currency to set.

Definition at line 1426 of file Transaction.c.

1427 {
1428  gnc_commodity *old_curr = trans->common_currency;
1429  if (!trans || !curr || trans->common_currency == curr) return;
1430  xaccTransBeginEdit(trans);
1431 
1432  trans->common_currency = curr;
1433  if (old_curr != NULL && trans->splits != NULL)
1434  {
1435  gnc_numeric rate = find_new_rate(trans, curr);
1436  if (!gnc_numeric_zero_p (rate))
1437  {
1438  FOR_EACH_SPLIT(trans, split_set_new_value(s, curr, old_curr, rate));
1439  }
1440  else
1441  {
1442  FOR_EACH_SPLIT(trans, xaccSplitSetValue(s, xaccSplitGetValue(s)));
1443  }
1444  }
1445 
1446  qof_instance_set_dirty(QOF_INSTANCE(trans));
1447  mark_trans(trans); /* Dirty balance of every account in trans */
1448  xaccTransCommitEdit(trans);
1449 }
void xaccSplitSetValue(Split *split, gnc_numeric val)
The xaccSplitSetValue() method sets the value of this split in the transaction&#39;s commodity.
Definition: gmock-Split.cpp:92
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
Definition: Transaction.c:1654
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
Definition: Transaction.c:1455
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction&#39;s commodity.
Definition: gmock-Split.cpp:84

◆ xaccTransSetDate()

void xaccTransSetDate ( Transaction *  trans,
int  day,
int  mon,
int  year 
)

The xaccTransSetDate() method does the same thing as xaccTransSetDate[Posted]Secs(), but takes a convenient day-month-year format.

(Footnote: this shouldn't matter to a user, but anyone modifying the engine should understand that when xaccTransCommitEdit() is called, the date order of each of the component splits will be checked, and will be restored in ascending date order.)

Definition at line 2080 of file Transaction.c.

2081 {
2082  GDate *date;
2083  if (!trans) return;
2084  date = g_date_new_dmy(day, mon, year);
2085  if (!g_date_valid(date))
2086  {
2087  PWARN("Attempted to set invalid date %d-%d-%d; set today's date instead.",
2088  year, mon, day);
2089  g_free(date);
2090  date = gnc_g_date_new_today();
2091  }
2092  xaccTransSetDatePostedGDate(trans, *date);
2093  g_free(date);
2094 }
void xaccTransSetDatePostedGDate(Transaction *trans, GDate date)
This method modifies posted date of the transaction, specified by a GDate.
Definition: Transaction.c:2035
#define PWARN(format, args...)
Log a warning.
Definition: qoflog.h:250
GDate * gnc_g_date_new_today()
Returns a newly allocated date of the current clock time, taken from time(2).
Definition: gnc-date.cpp:1229

◆ xaccTransSetDateEnteredSecs()

void xaccTransSetDateEnteredSecs ( Transaction *  trans,
time64  time 
)

Modify the date of when the transaction was entered.

The entered date is the date when the register entry was made.

Definition at line 2054 of file Transaction.c.

2055 {
2056  if (!trans) return;
2057  xaccTransSetDateInternal(trans, &trans->date_entered, secs);
2058 }

◆ xaccTransSetDatePostedGDate()

void xaccTransSetDatePostedGDate ( Transaction *  trans,
GDate  date 
)

This method modifies posted date of the transaction, specified by a GDate.

The posted date is the date when this transaction was posted at the bank.

This is identical to xaccTransSetDate(), but different from xaccTransSetDatePostedSecs which artificially introduces the time-of-day part, which needs to be ignored.

Definition at line 2035 of file Transaction.c.

2036 {
2037  GValue v = G_VALUE_INIT;
2038  if (!trans) return;
2039 
2040  /* We additionally save this date into a kvp frame to ensure in
2041  * the future a date which was set as *date* (without time) can
2042  * clearly be distinguished from the time64. */
2043  g_value_init (&v, G_TYPE_DATE);
2044  g_value_set_boxed (&v, &date);
2045  qof_instance_set_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_DATE_POSTED);
2046  g_value_unset (&v);
2047  /* mark dirty and commit handled by SetDateInternal */
2048  xaccTransSetDateInternal(trans, &trans->date_posted,
2049  gdate_to_time64(date));
2050  set_gains_date_dirty (trans);
2051 }
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue.
time64 gdate_to_time64(GDate d)
Turns a GDate into a time64, returning the first second of the day.
Definition: gnc-date.cpp:1256

◆ xaccTransSetDatePostedSecs()

void xaccTransSetDatePostedSecs ( Transaction *  trans,
time64  time 
)

The xaccTransSetDatePostedSecs() method will modify the posted date of the transaction, specified by a time64 (see ctime(3)).

The posted date is the date when this transaction was posted at the bank.

Please do not use this function, as the extra time-of-day part messes up a lot of places. Rather, please use xaccTransSetDatePostedGDate() or xaccTransSetDatePostedSecsNormalized().

Definition at line 2019 of file Transaction.c.

2020 {
2021  if (!trans) return;
2022  xaccTransSetDateInternal(trans, &trans->date_posted, secs);
2023  set_gains_date_dirty(trans);
2024 }

◆ xaccTransSetDatePostedSecsNormalized()

void xaccTransSetDatePostedSecsNormalized ( Transaction *  trans,
time64  time 
)

This function sets the posted date of the transaction, specified by a time64 (see ctime(3)).

Contrary to xaccTransSetDatePostedSecs(), the time will be normalized to only the date part, and the time-of-day will be ignored. The resulting date is the same as if it had been set as a GDate through xaccTransSetDatePostedGDate().

Please prefer this function over xaccTransSetDatePostedSecs().

The posted date is the date when this transaction was posted at the bank.

Definition at line 81 of file gmock-Transaction.cpp.

82 {
83  ASSERT_TRUE(GNC_IS_MOCKTRANSACTION(trans));
84  gnc_mocktransaction(trans)->set_date_posted_secs_normalized(time);
85 }

◆ xaccTransSetNotes()

void xaccTransSetNotes ( Transaction *  trans,
const char *  notes 
)

Sets the transaction Notes.

The Notes field is only visible in the register in double-line mode

Definition at line 111 of file gmock-Transaction.cpp.

112 {
113  ASSERT_TRUE(GNC_IS_MOCKTRANSACTION(trans));
114  gnc_mocktransaction(trans)->set_notes(notes);
115 }

◆ xaccTransSetReadOnly()

void xaccTransSetReadOnly ( Transaction *  trans,
const char *  reason 
)

Set the transaction to be ReadOnly by setting a non-NULL value as "reason".

FIXME: If "reason" is NULL, this function does nothing, instead of removing the readonly flag; the actual removal is possible only through xaccTransClearReadOnly().

Definition at line 2147 of file Transaction.c.

2148 {
2149  if (trans && reason)
2150  {
2151  GValue v = G_VALUE_INIT;
2152  g_value_init (&v, G_TYPE_STRING);
2153  g_value_set_string (&v, reason);
2154  xaccTransBeginEdit(trans);
2155  qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_READ_ONLY_REASON);
2156  qof_instance_set_dirty(QOF_INSTANCE(trans));
2157  g_value_unset (&v);
2158  xaccTransCommitEdit(trans);
2159 
2160  if (trans->readonly_reason != is_unset)
2161  g_free (trans->readonly_reason);
2162  trans->readonly_reason = g_strdup (reason);
2163  }
2164 }
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
Definition: Transaction.c:1654
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
Definition: Transaction.c:1455

◆ xaccTransSetTxnType()

void xaccTransSetTxnType ( Transaction *  trans,
char  type 
)

Set the Transaction Type: note the type will be saved into the Transaction kvp property as a backward compatibility measure, for previous GnuCash versions whose xaccTransGetTxnType reads from the kvp slots.

See TXN_TYPE_NONE, TXN_TYPE_INVOICE and TXN_TYPE_PAYMENT

Definition at line 2111 of file Transaction.c.

2112 {
2113  char s[2] = {type, '\0'};
2114  GValue v = G_VALUE_INIT;
2115  g_return_if_fail(trans);
2116  g_value_init (&v, G_TYPE_STRING);
2117  qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_TXN_TYPE_KVP);
2118  if (!g_strcmp0 (s, g_value_get_string (&v)))
2119  {
2120  g_value_unset (&v);
2121  return;
2122  }
2123  g_value_set_string (&v, s);
2124  xaccTransBeginEdit(trans);
2125  qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_TXN_TYPE_KVP);
2126  qof_instance_set_dirty(QOF_INSTANCE(trans));
2127  g_value_unset (&v);
2128  xaccTransCommitEdit(trans);
2129 }
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue.
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
Definition: Transaction.c:1654
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
Definition: Transaction.c:1455

◆ xaccTransUnvoid()

void xaccTransUnvoid ( Transaction *  transaction)

xaccTransUnvoid restores a voided transaction to its original state.

At some point when gnucash is enhanced to support an audit trail (i.e. write only transactions) this command should be automatically disabled when the audit trail feature is enabled.

Parameters
transactionThe transaction to restore from voided state.

Definition at line 2869 of file Transaction.c.

2870 {
2871  GValue v = G_VALUE_INIT;
2872  const char *s = NULL;
2873  g_return_if_fail(trans);
2874 
2875  s = xaccTransGetVoidReason (trans);
2876  if (s == NULL) return; /* Transaction isn't voided. Bail. */
2877  xaccTransBeginEdit(trans);
2878 
2879  qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, void_former_notes_str);
2880  if (G_VALUE_HOLDS_STRING (&v))
2881  qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str);
2882  qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, void_former_notes_str);
2883  qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, void_reason_str);
2884  qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, void_time_str);
2885  g_value_unset (&v);
2886  g_free (trans->void_reason);
2887  trans->void_reason = NULL;
2888 
2889  FOR_EACH_SPLIT(trans, xaccSplitUnvoid(s));
2890 
2891  /* Dirtying taken care of by ClearReadOnly */
2892  xaccTransClearReadOnly(trans);
2893  xaccTransCommitEdit(trans);
2894 }
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue.
const char * xaccTransGetVoidReason(const Transaction *trans)
Returns the user supplied textual reason why a transaction was voided.
Definition: Transaction.c:2835
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
Definition: Transaction.c:1654
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
Definition: Transaction.c:1455

◆ xaccTransVoid()

void xaccTransVoid ( Transaction *  transaction,
const char *  reason 
)

xaccTransVoid voids a transaction.

A void transaction has no values, is unaffected by reconciliation, and, by default is not included in any queries. A voided transaction may not be altered.

Parameters
transactionThe transaction to void.
reasonThe textual reason why this transaction is being voided.

Definition at line 2785 of file Transaction.c.

2786 {
2787  GValue v = G_VALUE_INIT;
2788  char iso8601_str[ISO_DATELENGTH + 1] = "";
2789 
2790  g_return_if_fail(trans && reason);
2791 
2792  /* Prevent voiding transactions that are already marked
2793  * read only, for example generated by the business features.
2794  */
2795  if (xaccTransGetReadOnly (trans))
2796  {
2797  PWARN ("Refusing to void a read-only transaction!");
2798  return;
2799  }
2800  xaccTransBeginEdit(trans);
2801  qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str);
2802  if (G_VALUE_HOLDS_STRING (&v))
2803  qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, void_former_notes_str);
2804  else
2805  g_value_init (&v, G_TYPE_STRING);
2806 
2807  g_value_set_string (&v, _("Voided transaction"));
2808  qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_notes_str);
2809  g_value_set_string (&v, reason);
2810  qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, void_reason_str);
2811  if (trans->void_reason != is_unset)
2812  g_free (trans->void_reason);
2813  trans->void_reason = g_strdup (reason);
2814 
2815  gnc_time64_to_iso8601_buff (gnc_time(NULL), iso8601_str);
2816  g_value_set_string (&v, iso8601_str);
2817  qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, void_time_str);
2818  g_value_unset (&v);
2819 
2820  FOR_EACH_SPLIT(trans, xaccSplitVoid(s));
2821 
2822  /* Dirtying taken care of by SetReadOnly */
2823  xaccTransSetReadOnly(trans, _("Transaction Voided"));
2824  xaccTransCommitEdit(trans);
2825 }
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue.
const char * xaccTransGetReadOnly(Transaction *trans)
Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text...
Definition: Transaction.c:2596
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.
#define PWARN(format, args...)
Log a warning.
Definition: qoflog.h:250
void xaccTransSetReadOnly(Transaction *trans, const char *reason)
Set the transaction to be ReadOnly by setting a non-NULL value as "reason".
Definition: Transaction.c:2147
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
Definition: Transaction.c:1654
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
Definition: Transaction.c:1455
time64 gnc_time(time64 *tbuf)
get the current local time
Definition: gnc-date.cpp:273
char * gnc_time64_to_iso8601_buff(time64 time, char *buff)
The gnc_time64_to_iso8601_buff() routine takes the input UTC time64 value and prints it as an ISO-860...
Definition: gnc-date.cpp:1142