36 #include <glib/gi18n.h>    39 #ifdef HAVE_SYS_TIME_H    40 # include <sys/time.h>    53 #include "TransactionP.hpp"    60 #include "qofinstance-p.h"    62 const char *void_former_amt_str = 
"void-former-amount";
    63 const char *void_former_val_str = 
"void-former-value";
    66 static QofLogModule log_module = GNC_MOD_ENGINE;
    69 #define GNC_SX_ID                    "sched-xaction"    70 #define GNC_SX_ACCOUNT               "account"    71 #define GNC_SX_CREDIT_FORMULA        "credit-formula"    72 #define GNC_SX_DEBIT_FORMULA         "debit-formula"    73 #define GNC_SX_CREDIT_NUMERIC        "credit-numeric"    74 #define GNC_SX_DEBIT_NUMERIC         "debit-numeric"    75 #define GNC_SX_SHARES                "shares"    88     PROP_SX_CREDIT_FORMULA,     
    89     PROP_SX_CREDIT_NUMERIC,     
    90     PROP_SX_DEBIT_FORMULA,      
    91     PROP_SX_DEBIT_NUMERIC,      
   102 static const char * split_type_normal = 
"normal";
   103 static const char * split_type_stock_split = 
"stock-split";
   106 G_DEFINE_TYPE(Split, gnc_split, QOF_TYPE_INSTANCE)
   109 gnc_split_init(Split* split)
   112     split->acc         = 
nullptr;
   113     split->orig_acc    = 
nullptr;
   114     split->parent      = 
nullptr;
   115     split->lot         = 
nullptr;
   117     split->action      = CACHE_INSERT(
"");
   118     split->memo        = CACHE_INSERT(
"");
   119     split->reconciled  = 
NREC;
   120     split->amount      = gnc_numeric_zero();
   121     split->value       = gnc_numeric_zero();
   123     split->date_reconciled  = 0;
   125     split->balance             = gnc_numeric_zero();
   126     split->cleared_balance     = gnc_numeric_zero();
   127     split->reconciled_balance  = gnc_numeric_zero();
   128     split->noclosing_balance   = gnc_numeric_zero();
   130     split->gains = GAINS_STATUS_UNKNOWN;
   131     split->gains_split = 
nullptr;
   135 gnc_split_dispose(GObject *splitp)
   137     G_OBJECT_CLASS(gnc_split_parent_class)->dispose(splitp);
   141 gnc_split_finalize(GObject* splitp)
   143     G_OBJECT_CLASS(gnc_split_parent_class)->finalize(splitp);
   152 gnc_split_get_property(GObject         *
object,
   160     g_return_if_fail(GNC_IS_SPLIT(
object));
   162     split = GNC_SPLIT(
object);
   166             g_value_set_string(value, split->action);
   169             g_value_set_string(value, split->memo);
   172             g_value_set_boxed(value, &split->value);
   175             g_value_set_boxed(value, &split->amount);
   177         case PROP_RECONCILE_DATE:
   178             t.t = split->date_reconciled;
   179             g_value_set_boxed(value, &t);
   182             g_value_take_object(value, split->parent);
   185             g_value_take_object(value, split->acc);
   188             g_value_take_object(value, split->lot);
   190         case PROP_SX_CREDIT_FORMULA:
   193         case PROP_SX_CREDIT_NUMERIC:
   196         case PROP_SX_DEBIT_FORMULA:
   199         case PROP_SX_DEBIT_NUMERIC:
   202         case PROP_SX_ACCOUNT:
   208         case PROP_ONLINE_ACCOUNT:
   211         case PROP_GAINS_SPLIT:
   214         case PROP_GAINS_SOURCE:
   218             G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
   224 gnc_split_set_property(GObject         *
object,
   232     g_return_if_fail(GNC_IS_SPLIT(
object));
   234     split = GNC_SPLIT(
object);
   235     if (prop_id < PROP_RUNTIME_0 && split->parent != 
nullptr)
   236         g_assert (qof_instance_get_editlevel(split->parent));
   247             number = 
static_cast<gnc_numeric*
>(g_value_get_boxed(value));
   251             number = 
static_cast<gnc_numeric*
>(g_value_get_boxed(value));
   254         case PROP_RECONCILE_DATE:
   255             t = 
static_cast<Time64*
>(g_value_get_boxed(value));
   259             xaccSplitSetParent(split, GNC_TRANSACTION(g_value_get_object(value)));
   262             xaccSplitSetAccount(split, GNC_ACCOUNT(g_value_get_object(value)));
   267         case PROP_SX_CREDIT_FORMULA:
   270         case PROP_SX_CREDIT_NUMERIC:
   273         case PROP_SX_DEBIT_FORMULA:
   276         case PROP_SX_DEBIT_NUMERIC:
   279         case PROP_SX_ACCOUNT:
   285         case PROP_ONLINE_ACCOUNT:
   288         case PROP_GAINS_SPLIT:
   291         case PROP_GAINS_SOURCE:
   295             G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
   301 gnc_split_class_init(SplitClass* klass)
   303     GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
   305     gobject_class->dispose = gnc_split_dispose;
   306     gobject_class->finalize = gnc_split_finalize;
   307     gobject_class->set_property = gnc_split_set_property;
   308     gobject_class->get_property = gnc_split_get_property;
   310     g_object_class_install_property
   313          g_param_spec_string(
"action",
   315                              "The action is an arbitrary string assigned "   316                              "by the user.  It is intended to be a short "   317                              "string that contains extra information about "   322     g_object_class_install_property
   325          g_param_spec_string(
"memo",
   327                              "The action is an arbitrary string assigned "   328                              "by the user.  It is intended to be a short "   329                              "string that describes the purpose of "   334     g_object_class_install_property
   337          g_param_spec_boxed(
"value",
   339                             "The value for this split in the common currency. "   340                             "The value and the amount provide enough information to "   341                             "calculate a conversion rate.",
   345     g_object_class_install_property
   348          g_param_spec_boxed(
"amount",
   350                             "The value for this split in the currency of its account. "   351                             "The value and the amount provide enough information to "   352                             "calculate a conversion rate.",
   356     g_object_class_install_property
   359          g_param_spec_boxed(
"reconcile-date",
   361                             "The date this split was reconciled.",
   365     g_object_class_install_property
   368          g_param_spec_object (
"transaction",
   370                               "The transaction that this split belongs to.",
   371                               GNC_TYPE_TRANSACTION,
   374     g_object_class_install_property
   377          g_param_spec_object (
"account",
   379                               "The account that this split belongs to.",
   383     g_object_class_install_property
   386          g_param_spec_object (
"lot",
   388                               "The lot that this split belongs to.",
   392     g_object_class_install_property
   394          PROP_SX_DEBIT_FORMULA,
   395          g_param_spec_string(
"sx-debit-formula",
   396                              "Schedule Transaction Debit Formula",
   397                              "The formula used to calculate the actual debit "   398                              "amount when a real split is generated from this "   403     g_object_class_install_property
   405          PROP_SX_DEBIT_NUMERIC,
   406          g_param_spec_boxed(
"sx-debit-numeric",
   407                             "Scheduled Transaction Debit Numeric",
   408                             "Numeric value to plug into the Debit Formula when a "   409                             "real split is generated from this SX split.",
   413     g_object_class_install_property
   415          PROP_SX_CREDIT_FORMULA,
   416          g_param_spec_string(
"sx-credit-formula",
   417                              "Schedule Transaction Credit Formula",
   418                              "The formula used to calculate the actual credit "   419                              "amount when a real split is generated from this "   424     g_object_class_install_property
   426          PROP_SX_CREDIT_NUMERIC,
   427          g_param_spec_boxed(
"sx-credit-numeric",
   428                             "Scheduled Transaction Credit Numeric",
   429                             "Numeric value to plug into the Credit Formula when a "   430                             "real split is generated from this SX split.",
   438     g_object_class_install_property
   441          g_param_spec_string(
"sx-shares",
   442                              "Scheduled Transaction Shares",
   443                              "Numeric value of shares to insert in a new split when "   444                              "it's generated from this SX split.",
   448     g_object_class_install_property
   451          g_param_spec_boxed(
"sx-account",
   452                             "Scheduled Transaction Account",
   453                             "The target account for a scheduled transaction split.",
   457     g_object_class_install_property
   460          g_param_spec_string (
"online-id",
   462                               "The online account which corresponds to this "   463                               "account for OFX/HCBI import",
   467     g_object_class_install_property
   470          g_param_spec_boxed (
"gains-split",
   472                              "The capital gains split associated with this "   473                              "split when this split represents the proceeds "   474                              "from the sale of a commodity inside a Lot.",
   478     g_object_class_install_property
   481          g_param_spec_boxed (
"gains-source",
   483                              "The source split for which this split this is "   495 xaccInitSplit(Split * split, QofBook *book)
   501 xaccSplitReinit(Split * split)
   504     split->acc         = 
nullptr;
   505     split->orig_acc    = 
nullptr;
   506     split->parent      = 
nullptr;
   507     split->lot         = 
nullptr;
   509     CACHE_REPLACE(split->action, 
"");
   510     CACHE_REPLACE(split->memo, 
"");
   511     split->reconciled  = 
NREC;
   512     split->amount      = gnc_numeric_zero();
   513     split->value       = gnc_numeric_zero();
   515     split->date_reconciled  = 0;
   517     split->balance             = gnc_numeric_zero();
   518     split->cleared_balance     = gnc_numeric_zero();
   519     split->reconciled_balance  = gnc_numeric_zero();
   520     split->noclosing_balance   = gnc_numeric_zero();
   522     qof_instance_set_idata(split, 0);
   524     split->gains = GAINS_STATUS_UNKNOWN;
   525     split->gains_split = 
nullptr;
   535     g_return_val_if_fail (book, 
nullptr);
   537     split = GNC_SPLIT(g_object_new (GNC_TYPE_SPLIT, 
nullptr));
   538     xaccInitSplit (split, book);
   553 xaccDupeSplit (
const Split *s)
   555     Split *split = GNC_SPLIT(g_object_new (GNC_TYPE_SPLIT, 
nullptr));
   561     split->inst.e_type = 
nullptr;
   562     qof_instance_copy_guid(split, s);
   565     split->parent = s->parent;
   567     split->orig_acc = s->orig_acc;
   570     CACHE_REPLACE(split->memo, s->memo);
   571     CACHE_REPLACE(split->action, s->action);
   573     qof_instance_copy_kvp (QOF_INSTANCE (split), QOF_INSTANCE (s));
   575     split->reconciled = s->reconciled;
   576     split->date_reconciled = s->date_reconciled;
   578     split->value = s->value;
   579     split->amount = s->amount;
   591 xaccSplitCloneNoKvp (
const Split *s)
   593     Split *split = GNC_SPLIT(g_object_new (GNC_TYPE_SPLIT, 
nullptr));
   595     split->parent              = 
nullptr;
   596     split->memo                = CACHE_INSERT(s->memo);
   597     split->action              = CACHE_INSERT(s->action);
   598     split->reconciled          = s->reconciled;
   599     split->date_reconciled     = s->date_reconciled;
   600     split->value               = s->value;
   601     split->amount              = s->amount;
   602     split->balance             = s->balance;
   603     split->cleared_balance     = s->cleared_balance;
   604     split->reconciled_balance  = s->reconciled_balance;
   605     split->noclosing_balance   = s->noclosing_balance;
   607     split->gains = GAINS_STATUS_UNKNOWN;
   608     split->gains_split = 
nullptr;
   622 xaccSplitCopyKvp (
const Split *from, Split *to)
   624     qof_instance_copy_kvp (QOF_INSTANCE (to), QOF_INSTANCE (from));
   641     if (!from_split || !to_split) 
return;
   654     qof_instance_set_dirty(QOF_INSTANCE(to_split));
   661 #ifdef DUMP_FUNCTIONS   663 xaccSplitDump (
const Split *split, 
const char *tag)
   666     memset (datebuff, 0, 
sizeof(datebuff));
   668     printf(
"  %s Split %p", tag, split);
   670     printf(
"    Account:  %p (%s)\n", split->acc,
   672     printf(
"    Commod:   %s\n",
   676     printf(
"    Lot:      %p\n", split->lot);
   677     printf(
"    Parent:   %p\n", split->parent);
   678     printf(
"    Gains:    %p\n", split->gains_split);
   679     printf(
"    Memo:     %s\n", split->memo ? split->memo : 
"(null)");
   680     printf(
"    Action:   %s\n", split->action ? split->action : 
"(null)");
   681     printf(
"    KVP Data: %s\n", qof_instance_kvp_as_string (QOF_INSTANCE (split)));
   682     printf(
"    Recncld:  %c (date %s)\n", split->reconciled, datebuff);
   688     printf(
"    RBalance: %s\n",
   700     xaccFreeSplit (GNC_SPLIT (inst));
   704 xaccFreeSplit (Split *split)
   709     if (((
char *) 1) == split->memo)
   711         PERR (
"double-free %p", split);
   714     CACHE_REMOVE(split->memo);
   715     CACHE_REMOVE(split->action);
   717     if (split->inst.e_type) 
   722         if (GNC_IS_ACCOUNT (split->acc)
   741     split->memo        = (
char *) 1;
   742     split->action      = 
nullptr;
   743     split->reconciled  = 
NREC;
   744     split->amount      = gnc_numeric_zero();
   745     split->value       = gnc_numeric_zero();
   746     split->parent      = 
nullptr;
   747     split->lot         = 
nullptr;
   748     split->acc         = 
nullptr;
   749     split->orig_acc    = 
nullptr;
   751     split->date_reconciled = 0;
   752     G_OBJECT_CLASS (QOF_INSTANCE_GET_CLASS (&split->inst))->dispose(G_OBJECT (split));
   754     if (split->gains_split)
   757         split->gains_split->gains_split = 
nullptr;
   759           other->gains_split = 
nullptr;
   762     g_object_unref(split);
   765 void mark_split (Split *s)
   769         g_object_set(s->acc, 
"sort-dirty", TRUE, 
"balance-dirty", TRUE, 
nullptr);
   780 xaccSplitEqualCheckBal (
const char *tag, gnc_numeric a, gnc_numeric b)
   790     PINFO (
"%sbalances differ: %s vs %s", tag, str_a, str_b);
   803                gboolean check_guids,
   804                gboolean check_balances,
   805                gboolean check_txn_splits)
   809     if (!sa && !sb) 
return TRUE; 
   813         PINFO (
"one is nullptr");
   817     if (sa == sb) 
return TRUE;
   825             PINFO (
"GUIDs differ");
   831     if ((same_book && sa->memo != sb->memo) || (!same_book && g_strcmp0(sa->memo, sb->memo) != 0))
   833         PINFO (
"memos differ: (%p)%s vs (%p)%s",
   834                sa->memo, sa->memo, sb->memo, sb->memo);
   838     if ((same_book && sa->action != sb->action) || (!same_book && g_strcmp0(sa->action, sb->action) != 0))
   840         PINFO (
"actions differ: %s vs %s", sa->action, sb->action);
   844     if (qof_instance_compare_kvp (QOF_INSTANCE (sa), QOF_INSTANCE (sb)) != 0)
   849         frame_a = qof_instance_kvp_as_string (QOF_INSTANCE (sa));
   850         frame_b = qof_instance_kvp_as_string (QOF_INSTANCE (sb));
   852         PINFO (
"kvp frames differ:\n%s\n\nvs\n\n%s", frame_a, frame_b);
   860     if (sa->reconciled != sb->reconciled)
   862         PINFO (
"reconcile flags differ: %c vs %c", sa->reconciled, sb->reconciled);
   866     if (sa->date_reconciled != sb->date_reconciled)
   868         PINFO (
"reconciled date differs");
   880         PINFO (
"amounts differ: %s vs %s", str_a, str_b);
   896         PINFO (
"values differ: %s vs %s", str_a, str_b);
   906         if (!xaccSplitEqualCheckBal (
"", sa->balance, sb->balance))
   908         if (!xaccSplitEqualCheckBal (
"cleared ", sa->cleared_balance,
   909                                      sb->cleared_balance))
   911         if (!xaccSplitEqualCheckBal (
"reconciled ", sa->reconciled_balance,
   912                                      sb->reconciled_balance))
   914         if (!xaccSplitEqualCheckBal (
"noclosing ", sa->noclosing_balance,
   915                                      sb->noclosing_balance))
   919     if (!
xaccTransEqual(sa->parent, sb->parent, check_guids, check_txn_splits,
   920                         check_balances, FALSE))
   922         PINFO (
"transactions differ");
   938     return s ? s->acc : 
nullptr;
   942 xaccSplitSetAccount (Split *s, 
Account *acc)
   946     g_return_if_fail(s && acc);
   954     qof_instance_set_dirty(QOF_INSTANCE(s));
   962     PERR(
"commit error: %d", errcode);
   963     gnc_engine_signal_commit_error( errcode );
   968 xaccSplitCommitEdit(Split *s)
   977     orig_acc = s->orig_acc;
   979     if (GNC_IS_ACCOUNT(s->acc))
   992             PERR(
"Account lost track of moved or deleted split.");
  1008             PERR(
"Account grabbed split prematurely.");
  1013     if (s->parent != s->orig_parent)
  1023         qof_event_gen (QOF_INSTANCE(s->lot), QOF_EVENT_MODIFY, 
nullptr);
  1029     s->orig_acc = s->acc;
  1030     s->orig_parent = s->parent;
  1036         g_object_set(acc, 
"sort-dirty", TRUE, 
"balance-dirty", TRUE, 
nullptr);
  1043 xaccSplitRollbackEdit(Split *s)
  1049     if (s->acc != s->orig_acc)
  1050         s->acc = s->orig_acc;
  1056         qof_instance_set_destroying(s, FALSE);
  1064     xaccSplitSetParent(s, s->orig_parent);
  1074     if (!guid || !book) 
return nullptr;
  1090 xaccSplitDetermineGainStatus (Split *split)
  1095     if (GAINS_STATUS_UNKNOWN != split->gains) 
return;
  1100         split->gains = GAINS_STATUS_A_VDIRTY | GAINS_STATUS_DATE_DIRTY;
  1101         split->gains_split = other;
  1105     if (
auto v = qof_instance_get_path_kvp<GncGUID*> (QOF_INSTANCE (split), {
"gains-source"}))
  1106         guid = 
const_cast<GncGUID*
>(*v);
  1111         split->gains = GAINS_STATUS_A_VDIRTY | GAINS_STATUS_DATE_DIRTY;
  1118         split->gains = GAINS_STATUS_GAINS;
  1120         split->gains_split = other;
  1128 get_currency_denom(
const Split * s)
  1130     if (!(s && s->parent && s->parent->common_currency))
  1141 get_commodity_denom(
const Split * s)
  1168     SET_GAINS_A_VDIRTY(s);
  1170     qof_instance_set_dirty(QOF_INSTANCE(s));
  1176 qofSplitSetSharePrice (Split *split, gnc_numeric price)
  1178     g_return_if_fail(split);
  1180                                    price, get_currency_denom(split),
  1196                                price, get_currency_denom(s),
  1199     SET_GAINS_VDIRTY(s);
  1201     qof_instance_set_dirty(QOF_INSTANCE(s));
  1207 qofSplitSetAmount (Split *split, gnc_numeric amt)
  1209     g_return_if_fail(split);
  1217         split->amount = amt;
  1227     ENTER (
"(split=%p) old amt=%" G_GINT64_FORMAT 
"/%" G_GINT64_FORMAT
  1228            " new amt=%" G_GINT64_FORMAT 
"/%" G_GINT64_FORMAT, s,
  1229            s->amount.num, s->amount.denom, amt.num, amt.denom);
  1241     SET_GAINS_ADIRTY(s);
  1243     qof_instance_set_dirty(QOF_INSTANCE(s));
  1249 qofSplitSetValue (Split *split, gnc_numeric amt)
  1251     g_return_if_fail(split);
  1261     gnc_numeric new_val;
  1265     ENTER (
"(split=%p) old val=%" G_GINT64_FORMAT 
"/%" G_GINT64_FORMAT
  1266            " new val=%" G_GINT64_FORMAT 
"/%" G_GINT64_FORMAT, s,
  1267            s->value.num, s->value.denom, amt.num, amt.denom);
  1279         PERR(
"numeric error %s in converting the split value's denominator with amount %s and denom %d",
  1284     SET_GAINS_VDIRTY(s);
  1286     qof_instance_set_dirty(QOF_INSTANCE(s));
  1297     return s ? s->balance : gnc_numeric_zero();
  1303     return s ? s->noclosing_balance : gnc_numeric_zero();
  1309     return s ? s->cleared_balance : gnc_numeric_zero();
  1315     return s ? s->reconciled_balance : gnc_numeric_zero();
  1320                        const gnc_commodity * base_currency)
  1322     const gnc_commodity *currency;
  1323     const gnc_commodity *commodity;
  1330         PERR (
"split must have a parent account");
  1345                                             get_commodity_denom(s),
  1349                                        get_currency_denom(s),
  1359         PERR (
"inappropriate base currency %s "  1360               "given split currency=%s and commodity=%s\n",
  1367     SET_GAINS_A_VDIRTY(s);
  1369     qof_instance_set_dirty(QOF_INSTANCE(s));
  1376     if (!s || !s->acc || !s->parent) 
return gnc_numeric_zero();
  1385     PERR (
"inappropriate base currency %s "  1386           "given split currency=%s and commodity=%s\n",
  1390     return gnc_numeric_zero();
  1397 xaccSplitConvertAmount (
const Split *split, 
const Account * account)
  1399     gnc_commodity *acc_com, *to_commodity;
  1401     gnc_numeric amount, value, convrate;
  1408     if (split_acc == account)
  1431             gnc_commodity* split_comm =
  1437                 PERR(
"The split's (%s) amount can't be converted from %s into %s.",
  1442                 return gnc_numeric_zero();
  1460     convrate = xaccTransGetAccountConvRate(txn, account);
  1476     if (!split) 
return TRUE;
  1479     trans = split->parent;
  1488     qof_instance_set_dirty(QOF_INSTANCE(split));
  1489     qof_instance_set_destroying(split, TRUE);
  1504     const char *da, *db;
  1505     gboolean action_for_num;
  1507     if (sa == sb) 
return 0;
  1518                                             sb->parent, sb->action);
  1521     if (retval) 
return retval;
  1524     da = sa->memo ? sa->memo : 
"";
  1525     db = sb->memo ? sb->memo : 
"";
  1526     retval = g_utf8_collate (da, db);
  1531     da = sa->action ? sa->action : 
"";
  1532     db = sb->action ? sb->action : 
"";
  1533     retval = g_utf8_collate (da, db);
  1538     if (sa->reconciled < sb->reconciled) 
return -1;
  1539     if (sa->reconciled > sb->reconciled) 
return +1;
  1543     if (comp < 0) 
return -1;
  1544     if (comp > 0) 
return +1;
  1547     if (comp < 0) 
return -1;
  1548     if (comp > 0) 
return +1;
  1551     if (sa->date_reconciled < sb->date_reconciled)
  1553     else if (sa->date_reconciled > sb->date_reconciled)
  1558     if (retval) 
return retval;
  1564 xaccSplitOrderDateOnly (
const Split *sa, 
const Split *sb)
  1566     Transaction *ta, *tb;
  1568     if (sa == sb) 
return 0;
  1575     if ( !ta && !tb ) 
return 0;
  1576     if ( !tb ) 
return -1;
  1577     if ( !ta ) 
return +1;
  1579     if (ta->date_posted == tb->date_posted)
  1581     return (ta->date_posted > tb->date_posted) - (ta->date_posted < tb->date_posted);
  1585 get_corr_account_split(
const Split *sa, 
const Split **retval)
  1588     g_return_val_if_fail(sa, FALSE);
  1604     static const char *split_const = 
nullptr;
  1605     const Split *other_split;
  1607     if (!get_corr_account_split(sa, &other_split))
  1610             split_const = _(
"-- Split Transaction --");
  1621     static const char *split_const = 
nullptr;
  1622     const Split *other_split;
  1624     if (!get_corr_account_split(sa, &other_split))
  1627             split_const = _(
"-- Split Transaction --");
  1629         return g_strdup(split_const);
  1637     static const char *split_const = 
nullptr;
  1638     const Split *other_split;
  1640     if (!get_corr_account_split(sa, &other_split))
  1643             split_const = C_(
"Displayed account code of the other account in a multi-split transaction", 
"Split");
  1655     if (sa == sb) 
return 0;
  1661     if (aa == ab) 
return 0;
  1663     auto path_a = gnc_account_get_all_parents (aa);
  1664     auto path_b = gnc_account_get_all_parents (ab);
  1665     auto mismatch_pair = std::mismatch (path_a.rbegin(), path_a.rend(),
  1666                                         path_b.rbegin(), path_b.rend());
  1668     return mismatch_pair.first == path_a.rend() ? -1
  1669         : mismatch_pair.second == path_b.rend() ? 1
  1679     if (!sa && !sb) 
return 0;
  1694     if (!sa && !sb) 
return 0;
  1704     retval = g_strcmp0(ca, cb);
  1713     const char *ca, *cb;
  1714     if (!sa && !sb) 
return 0;
  1720     return g_strcmp0(ca, cb);
  1724 qofSplitSetMemo (Split *split, 
const char* memo)
  1726     g_return_if_fail(split);
  1727     CACHE_REPLACE(split->memo, memo);
  1733     if (!split || !memo) 
return;
  1736     CACHE_REPLACE(split->memo, memo);
  1737     qof_instance_set_dirty(QOF_INSTANCE(split));
  1743 qofSplitSetAction (Split *split, 
const char *actn)
  1745     g_return_if_fail(split);
  1746     CACHE_REPLACE(split->action, actn);
  1752     if (!split || !actn) 
return;
  1755     CACHE_REPLACE(split->action, actn);
  1756     qof_instance_set_dirty(QOF_INSTANCE(split));
  1762 qofSplitSetReconcile (Split *split, 
char recn)
  1764     g_return_if_fail(split);
  1772             split->reconciled = recn;
  1777             PERR(
"Bad reconciled flag");
  1785     if (!split || split->reconciled == recn) 
return;
  1795             split->reconciled = recn;
  1797             qof_instance_set_dirty(QOF_INSTANCE(split));
  1801             PERR(
"Bad reconciled flag");
  1814     split->date_reconciled = secs;
  1815     qof_instance_set_dirty(QOF_INSTANCE(split));
  1825     return split ? split->date_reconciled : 0;
  1836     return split ? split->parent : 
nullptr;
  1840 xaccSplitSetParent(Split *s, Transaction *t)
  1842     Transaction *old_trans;
  1845     g_return_if_fail(s);
  1846     if (s->parent == t) 
return;
  1848     if (s->parent != s->orig_parent && s->orig_parent != t)
  1849         PERR(
"You may not add the split to more than one transaction"  1850              " during the BeginEdit/CommitEdit block.");
  1852     old_trans = s->parent;
  1860         qof_event_gen(&old_trans->inst, GNC_EVENT_ITEM_REMOVED, &ed);
  1865     qof_instance_set_dirty(QOF_INSTANCE(s));
  1873         if (
nullptr == g_list_find(t->splits, s))
  1874             t->splits = g_list_append(t->splits, s);
  1886     return split ? split->lot : 
nullptr;
  1894     qof_instance_set_dirty(QOF_INSTANCE(split));
  1901     return split ? split->memo : 
nullptr;
  1907     return split ? split->action : 
nullptr;
  1913     return split ? split->reconciled : 
' ';
  1920     return split ? split->amount : gnc_numeric_zero();
  1926     return split ? split->value : gnc_numeric_zero();
  1932     gnc_numeric amt, val, price;
  1933     if (!split) 
return gnc_numeric_create(0, 1);
  1943         return gnc_numeric_create(0, 1);
  1955         PERR(
"Computing share price failed (%d): [ %" G_GINT64_FORMAT 
" / %"  1956              G_GINT64_FORMAT 
" ] / [ %" G_GINT64_FORMAT 
" / %" G_GINT64_FORMAT 
" ]",
  1958         return gnc_numeric_create(0, 1);
  1976     if (!s) 
return nullptr;
  1978     auto type{qof_instance_get_path_kvp<const char*> (QOF_INSTANCE(s), {
"split-type"})};
  1980     if (!type || !g_strcmp0 (*type, split_type_normal))
  1981         return split_type_normal;
  1983     if (!g_strcmp0 (*type, split_type_stock_split))
  1984         return split_type_stock_split;
  1986     PERR (
"unexpected split-type %s, reset to normal.", *type);
  1987     return split_type_normal;
  1997     s->value = gnc_numeric_zero();
  1998     qof_instance_set_path_kvp<const char*> (QOF_INSTANCE(s), g_strdup(split_type_stock_split),
  2000     SET_GAINS_VDIRTY(s);
  2002     qof_instance_set_dirty(QOF_INSTANCE(s));
  2012     g_return_if_fail (split != 
nullptr);
  2013     g_return_if_fail (other_split != 
nullptr);
  2017     qof_instance_kvp_add_guid (QOF_INSTANCE (split), 
"lot-split",
  2020     qof_instance_set_dirty (QOF_INSTANCE (split));
  2027     return qof_instance_has_slot (QOF_INSTANCE (split), 
"lot-split");
  2035     g_return_val_if_fail (split != 
nullptr, FALSE);
  2036     g_return_val_if_fail (other_split != 
nullptr, FALSE);
  2039     return qof_instance_kvp_has_guid (QOF_INSTANCE (split), 
"lot-split",
  2048     g_return_if_fail (split != 
nullptr);
  2049     g_return_if_fail (other_split != 
nullptr);
  2053     qof_instance_kvp_remove_guid (QOF_INSTANCE (split), 
"lot-split",
  2056     qof_instance_set_dirty (QOF_INSTANCE (split));
  2064     qof_instance_kvp_merge_guids (QOF_INSTANCE (split),
  2065                                   QOF_INSTANCE (other_split), 
"lot-split");
  2067     qof_instance_set_dirty (QOF_INSTANCE (split));
  2087     Split *other = 
nullptr;
  2089     if (!split) 
return nullptr;
  2090     trans = split->parent;
  2091     if (!trans) 
return nullptr;
  2095         Split *s = GNC_SPLIT(n->data);
  2097             (!xaccTransStillHasSplit(trans, s)) ||
  2099             (qof_instance_has_slot (QOF_INSTANCE (s), 
"lot-split")))
  2116     g_return_val_if_fail(split, gnc_numeric_zero());
  2117     auto num{qof_instance_get_path_kvp<gnc_numeric> (QOF_INSTANCE(split), {void_former_amt_str})};
  2118     return num ? *num : gnc_numeric_zero();
  2124     g_return_val_if_fail(split, gnc_numeric_zero());
  2125     auto num{qof_instance_get_path_kvp<gnc_numeric> (QOF_INSTANCE(split), {void_former_val_str})};
  2126     return num ? *num : gnc_numeric_zero();
  2130 xaccSplitVoid(Split *split)
  2132     g_return_if_fail (GNC_IS_SPLIT(split));
  2133     qof_instance_set_path_kvp<gnc_numeric> (QOF_INSTANCE(split), 
xaccSplitGetAmount(split), {void_former_amt_str});
  2134     qof_instance_set_path_kvp<gnc_numeric> (QOF_INSTANCE(split), 
xaccSplitGetValue(split), {void_former_val_str});
  2135     qof_instance_set_dirty (QOF_INSTANCE(split));
  2137     static gnc_numeric zero = gnc_numeric_zero();
  2144 xaccSplitUnvoid(Split *split)
  2146     g_return_if_fail (GNC_IS_SPLIT(split));
  2150     qof_instance_set_path_kvp<gnc_numeric> (QOF_INSTANCE(split), {}, {void_former_amt_str});
  2151     qof_instance_set_path_kvp<gnc_numeric> (QOF_INSTANCE(split), {}, {void_former_val_str});
  2152     qof_instance_set_dirty (QOF_INSTANCE(split));
  2168 static QofObject split_object_def =
  2171     DI(.e_type            = ) GNC_ID_SPLIT,
  2172     DI(.type_label        = ) "Split",
  2174     DI(.book_begin        = ) 
nullptr,
  2175     DI(.book_end          = ) 
nullptr,
  2178     DI(.foreach           = ) qof_collection_foreach,
  2184 split_account_guid_getter (gpointer obj, const QofParam *p)
  2186     Split *s = GNC_SPLIT(obj);
  2189     if (!s) 
return nullptr;
  2191     if (!acc) 
return nullptr;
  2196 DxaccSplitGetShareAmount (
const Split * split)
  2202 no_op (gpointer obj, 
const QofParam *p)
  2208 qofSplitSetParentTrans(Split *s, 
QofInstance *ent)
  2210     Transaction *trans = (Transaction*)ent;
  2212     g_return_if_fail(trans);
  2213     xaccSplitSetParent(s, trans);
  2221     g_return_if_fail(acc);
  2222     xaccSplitSetAccount(s, acc);
  2225 gboolean xaccSplitRegister (
void)
  2227     static const QofParam params[] =
  2230                 SPLIT_DATE_RECONCILED, QOF_TYPE_DATE,
  2238                 "d-share-amount", QOF_TYPE_DOUBLE,
  2242                 "d-share-int64", QOF_TYPE_INT64,
  2246                 SPLIT_BALANCE, QOF_TYPE_NUMERIC,
  2250                 SPLIT_CLEARED_BALANCE, QOF_TYPE_NUMERIC,
  2254                 SPLIT_RECONCILED_BALANCE, QOF_TYPE_NUMERIC,
  2258                 SPLIT_MEMO, QOF_TYPE_STRING,
  2262                 SPLIT_ACTION, QOF_TYPE_STRING,
  2266                 SPLIT_RECONCILE, QOF_TYPE_CHAR,
  2271                 SPLIT_AMOUNT, QOF_TYPE_NUMERIC,
  2275                 SPLIT_SHARE_PRICE, QOF_TYPE_NUMERIC,
  2280                 SPLIT_VALUE, QOF_TYPE_DEBCRED,
  2285                 SPLIT_VOIDED_AMOUNT, QOF_TYPE_NUMERIC,
  2289                 SPLIT_VOIDED_VALUE, QOF_TYPE_NUMERIC,
  2294                 SPLIT_TRANS, GNC_ID_TRANS,
  2299                 SPLIT_ACCOUNT, GNC_ID_ACCOUNT,
  2305             { SPLIT_ACCT_FULLNAME, SPLIT_ACCT_FULLNAME, no_op, 
nullptr },
  2306             { SPLIT_CORR_ACCT_NAME, SPLIT_CORR_ACCT_NAME, no_op, 
nullptr },
  2307             { SPLIT_CORR_ACCT_CODE, SPLIT_CORR_ACCT_CODE, no_op, 
nullptr },
  2310                 QOF_PARAM_GUID, QOF_TYPE_GUID,
  2329 _utest_split_fill_functions (
void)
  2333     func->xaccSplitEqualCheckBal = xaccSplitEqualCheckBal;
  2334     func->get_currency_denom = get_currency_denom;
  2335     func->get_commodity_denom = get_commodity_denom;
  2336     func->get_corr_account_split = get_corr_account_split;
 void xaccSplitSetValue(Split *s, gnc_numeric amt)
The xaccSplitSetValue() method sets the value of this split in the transaction's commodity. 
 
int qof_instance_version_cmp(const QofInstance *left, const QofInstance *right)
Compare two instances, based on their last update times. 
 
gnc_numeric xaccSplitGetClearedBalance(const Split *s)
The cleared-balance is the currency-denominated balance of all transactions that have been marked as ...
 
gint xaccSplitOrder(const Split *sa, const Split *sb)
The xaccSplitOrder(sa,sb) method is useful for sorting. 
 
This is the private header for the account structure. 
 
void xaccSplitAddPeerSplit(Split *split, const Split *other_split, time64 timestamp)
Add a peer split to this split's lot-split list. 
 
gboolean gnc_numeric_equal(gnc_numeric a, gnc_numeric b)
Equivalence predicate: Returns TRUE (1) if a and b represent the same number. 
 
void xaccSplitSetBaseValue(Split *s, 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...
 
void xaccSplitSetAction(Split *split, const char *actn)
The Action is an arbitrary user-assigned string. 
 
gchar * gnc_num_dbg_to_string(gnc_numeric n)
Convert to string. 
 
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity. 
 
void xaccSplitMakeStockSplit(Split *s)
Mark a split to be of type stock split - after this, you shouldn't modify the value anymore...
 
const GncGUID * qof_instance_get_guid(gconstpointer inst)
Return the GncGUID of this instance. 
 
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue. 
 
int xaccSplitCompareAccountCodes(const Split *sa, const Split *sb)
Compare two splits by code of account. 
 
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity. 
 
#define qof_instance_is_dirty
Return value of is_dirty flag. 
 
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer. 
 
gboolean qof_collection_is_dirty(const QofCollection *col)
Return value of 'dirty' flag on collection. 
 
QofInstance * qof_collection_lookup_entity(const QofCollection *col, const GncGUID *guid)
Find the entity going only from its guid. 
 
#define PINFO(format, args...)
Print an informational note. 
 
gnc_numeric xaccSplitGetReconciledBalance(const Split *s)
Returns the reconciled-balance of this split. 
 
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account's account type. 
 
gboolean xaccSplitDestroy(Split *split)
Destructor. 
 
QofBackendError
The errors that can be reported to the GUI & other front-end users. 
 
int xaccAccountGetCommoditySCU(const Account *acc)
Return the SCU for the account. 
 
const char * xaccAccountGetCode(const Account *acc)
Get the account's accounting code. 
 
gnc_numeric gnc_numeric_neg(gnc_numeric a)
Returns a newly created gnc_numeric that is the negative of the given gnc_numeric value...
 
GncGUID * guid_copy(const GncGUID *guid)
Returns a newly allocated GncGUID that matches the passed-in GUID. 
 
const char * xaccTransGetReadOnly(Transaction *trans)
Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text...
 
gboolean qof_instance_get_destroying(gconstpointer ptr)
Retrieve the flag that indicates whether or not this object is about to be destroyed. 
 
void xaccSplitCopyOnto(const Split *from_split, Split *to_split)
This is really a helper for xaccTransCopyOnto. 
 
void qof_instance_set(QofInstance *inst, const gchar *first_prop,...)
Wrapper for g_object_set Group setting multiple parameters in a single begin/commit/rollback. 
 
gboolean qof_book_use_split_action_for_num_field(const QofBook *book)
Returns TRUE if this book uses split action field as the 'Num' field, FALSE if it uses transaction nu...
 
void qof_class_register(QofIdTypeConst obj_name, QofSortFunc default_sort_function, const QofParam *params)
This function registers a new object class with the Qof subsystem. 
 
char xaccSplitGetReconcile(const Split *split)
Returns the value of the reconcile flag. 
 
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equal. 
 
void gnc_lot_add_split(GNCLot *lot, Split *split)
Adds a split to this lot. 
 
gboolean gnc_account_remove_split(Account *acc, Split *s)
Remove the given split from an account. 
 
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0. 
 
Object instance holds common fields that most gnucash objects use. 
 
void xaccSplitSetReconcile(Split *split, char recn)
Set the reconcile flag. 
 
void xaccAccountInsertLot(Account *acc, GNCLot *lot)
The xaccAccountInsertLot() method will register the indicated lot with this account. 
 
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split. 
 
API for Transactions and Splits (journal entries) 
 
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...
 
void xaccSplitRemovePeerSplit(Split *split, const Split *other_split)
Remove a peer split from this split's lot-split list. 
 
int(* QofSortFunc)(gconstpointer, gconstpointer)
This function is the default sort function for a particular object type. 
 
gint gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
Returns 1 if a>b, -1 if b>a, 0 if a == b. 
 
gboolean xaccTransIsBalanced(const Transaction *trans)
Returns true if the transaction is balanced according to the rules currently in effect. 
 
#define QOF_OBJECT_VERSION
Defines the version of the core object object registration interface. 
 
gchar * gnc_numeric_to_string(gnc_numeric n)
Convert to string. 
 
int xaccSplitCompareOtherAccountFullNames(const Split *sa, const Split *sb)
Compare two splits by full name of the other account. 
 
#define PERR(format, args...)
Log a serious error. 
 
QofBook * xaccSplitGetBook(const Split *split)
Returns the book of this split, i.e. 
 
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. 
 
#define ENTER(format, args...)
Print a function entry debugging message. 
 
gnc_numeric xaccSplitGetBalance(const Split *s)
Returns the running balance up to and including the indicated split. 
 
#define QOF_PARAM_BOOK
"Known" Object Parameters – all objects must support these 
 
Split * xaccSplitGetCapGainsSplit(const Split *split)
The xaccSplitGetCapGainsSplit() routine returns the split that records the cap gains for this split...
 
void gnc_lot_set_closed_unknown(GNCLot *lot)
Reset closed flag so that it will be recalculated. 
 
void(* QofSetterFunc)(gpointer, gpointer)
The QofSetterFunc defines an function pointer for parameter setters. 
 
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue. 
 
int xaccSplitCompareAccountFullNames(const Split *sa, const Split *sb)
Compare two splits by full name of account. 
 
#define VREC
split is void 
 
Account used to record multiple commodity transactions. 
 
gboolean xaccSplitEqual(const Split *sa, const Split *sb, gboolean check_guids, gboolean check_balances, gboolean check_txn_splits)
Equality. 
 
gboolean xaccSplitHasPeers(const Split *split)
Does this split have peers? 
 
void qof_instance_init_data(QofInstance *inst, QofIdType type, QofBook *book)
Initialise the settings associated with an instance. 
 
int xaccTransCountSplits(const Transaction *trans)
Returns the number of splits in this transaction. 
 
#define xaccAccountGetGUID(X)
 
gdouble gnc_numeric_to_double(gnc_numeric n)
Convert numeric to floating-point value. 
 
convert single-entry accounts to clean double-entry 
 
void xaccSplitMergePeerSplits(Split *split, const Split *other_split)
Merge the other_split's peer splits into split's peers. 
 
gnc_numeric xaccSplitVoidFormerAmount(const Split *split)
Returns the original pre-void amount of a split. 
 
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. 
 
guint32 qof_instance_get_idata(gconstpointer inst)
get the instance tag number used for kvp management in sql backends. 
 
void xaccSplitSetAmount(Split *s, gnc_numeric amt)
The xaccSplitSetAmount() method sets the amount in the account's commodity that the split should have...
 
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...
 
gboolean xaccTransEqual(const Transaction *ta, const Transaction *tb, gboolean check_guids, gboolean check_splits, gboolean check_balances, gboolean assume_ordered)
Equality. 
 
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 '...
 
gnc_numeric xaccSplitVoidFormerValue(const Split *split)
Returns the original pre-void value of a split. 
 
Account public routines (C++ api) 
 
#define YREC
The Split has been reconciled. 
 
gnc_numeric gnc_numeric_mul(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Multiply a times b, returning the product. 
 
const char * gnc_numeric_errorCode_to_string(GNCNumericErrorCode error_code)
Returns a string representation of the given GNCNumericErrorCode. 
 
void xaccSplitSetMemo(Split *split, const char *memo)
The memo is an arbitrary string associated with a split. 
 
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator. 
 
#define FREC
frozen into accounting period 
 
int xaccSplitCompareOtherAccountCodes(const Split *sa, const Split *sb)
Compare two splits by code of the other account. 
 
void xaccSplitSetSharePriceAndAmount(Split *s, gnc_numeric price, gnc_numeric amt)
The xaccSplitSetSharePriceAndAmount() method will simultaneously update the share price and the numbe...
 
void qof_instance_copy_book(gpointer ptr1, gconstpointer ptr2)
Copy the book from one QofInstances to another. 
 
gnc_numeric xaccSplitGetNoclosingBalance(const Split *s)
The noclosing-balance is the currency-denominated balance of all transactions except 'closing' transa...
 
#define SPLIT_ACCOUNT_GUID
for guid_match_all 
 
void xaccAccountRecomputeBalance(Account *acc)
The following recompute the partial balances (stored with the transaction) and the total balance...
 
gboolean xaccSplitIsPeerSplit(const Split *split, const Split *other_split)
Report if a split is a peer of this one. 
 
char * xaccSplitGetCorrAccountFullName(const Split *sa)
These functions take a split, get the corresponding split on the "other side" of the transaction...
 
void gnc_lot_remove_split(GNCLot *lot, Split *split)
Adds a split from this lot. 
 
gboolean qof_commit_edit_part2(QofInstance *inst, void(*on_error)(QofInstance *, QofBackendError), void(*on_done)(QofInstance *), void(*on_free)(QofInstance *))
part2 – deal with the backend 
 
gpointer(* QofAccessFunc)(gpointer object, const QofParam *param)
The QofAccessFunc defines an arbitrary function pointer for access functions. 
 
#define MAX_DATE_LENGTH
The maximum length of a string created by the date printers. 
 
void qof_collection_mark_clean(QofCollection *)
reset value of dirty flag 
 
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
 
Additional event handling code. 
 
gnc_numeric gnc_numeric_div(gnc_numeric x, gnc_numeric y, gint64 denom, gint how)
Division. 
 
#define xaccSplitGetGUID(X)
 
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
 
gnc_numeric xaccSplitGetSharePrice(const Split *split)
Returns the price of the split, that is, the value divided by the amount. 
 
int xaccTransGetSplitIndex(const Transaction *trans, const Split *split)
Inverse of xaccTransGetSplit() 
 
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 ...
 
All type declarations for the whole Gnucash engine. 
 
const GncGUID * qof_entity_get_guid(gconstpointer ent)
 
#define CREC
The Split has been cleared. 
 
gboolean qof_instance_books_equal(gconstpointer ptr1, gconstpointer ptr2)
See if two QofInstances share the same book. 
 
gnc_numeric xaccSplitGetBaseValue(const Split *s, const gnc_commodity *base_currency)
Depending on the base_currency, return either the value or the amount of this split: If the base_curr...
 
Split * xaccMallocSplit(QofBook *book)
Constructor. 
 
const char * xaccSplitGetCorrAccountName(const Split *sa)
document me 
 
Encapsulate all the information about a dataset. 
 
gboolean gnc_account_insert_split(Account *acc, Split *s)
Insert the given split from an account. 
 
void xaccSplitSetLot(Split *split, GNCLot *lot)
Assigns the split to a specific Lot. 
 
API for the transaction logger. 
 
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
Retrieve the 'print' name for the specified commodity. 
 
void xaccSplitSetDateReconciledSecs(Split *split, time64 secs)
Set the date on which this split was reconciled by specifying the time as time64. ...
 
time64 xaccSplitGetDateReconciled(const Split *split)
Retrieve the date when the Split was reconciled. 
 
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction's commodity. 
 
Account * xaccSplitGetAccount(const Split *s)
Returns the account of this split, which was set through xaccAccountInsertSplit(). 
 
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity. 
 
gnc_commodity * xaccTransGetCurrency(const Transaction *trans)
Returns the valuation commodity of this transaction. 
 
#define xaccAccountInsertSplit(acc, s)
The xaccAccountInsertSplit() method will insert the indicated split into the indicated account...
 
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances. 
 
const char * xaccSplitGetCorrAccountCode(const Split *sa)
document me 
 
Split * xaccSplitGetOtherSplit(const Split *split)
The xaccSplitGetOtherSplit() is a convenience routine that returns the other of a pair of splits...
 
#define LEAVE(format, args...)
Print a function exit debugging message. 
 
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
 
void xaccSplitSetSharePrice(Split *s, gnc_numeric price)
 
time64 gnc_time(time64 *tbuf)
get the current time 
 
int xaccTransOrder(const Transaction *ta, const Transaction *tb)
The xaccTransOrder(ta,tb) method is useful for sorting. 
 
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)
Check for error signal in value. 
 
const char * xaccSplitGetMemo(const Split *split)
Returns the memo string. 
 
const char * xaccSplitGetAction(const Split *split)
Returns the action string. 
 
QofCollection * qof_book_get_collection(const QofBook *book, QofIdType entity_type)
Return The table of entities of the given type. 
 
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
 
Account * gnc_lot_get_account(const GNCLot *lot)
Returns the account with which this lot is associated. 
 
gboolean qof_object_register(const QofObject *object)
Register new types of object objects. 
 
const char * xaccSplitGetType(const Split *s)
The xaccIsPeerSplit() is a convenience routine that returns TRUE (a non-zero value) if the two splits...
 
const char * xaccAccountGetName(const Account *acc)
Get the account's name. 
 
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments. 
 
#define GNC_EVENT_ITEM_ADDED
These events are used when a split is added to an account. 
 
#define GNC_DENOM_AUTO
Values that can be passed as the 'denom' argument. 
 
The type used to store guids in C. 
 
Utilities to Automatically Compute Capital Gains/Losses. 
 
size_t qof_print_date_buff(char *buff, size_t buflen, time64 secs)
Convenience: calls through to qof_print_date_dmy_buff(). 
 
SplitList * xaccTransGetSplitList(const Transaction *trans)
The xaccTransGetSplitList() method returns a GList of the splits in a transaction. 
 
Commodity handling public routines. 
 
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equivalent. 
 
GNCLot * xaccSplitGetLot(const Split *split)
Returns the pointer to the debited/credited Lot where this split belongs to, or NULL if it doesn't be...
 
#define NREC
not reconciled or cleared 
 
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account's commodity.