diff --git a/src/engine/Split.c b/src/engine/Split.c index 8c9af181b2..b5e541854b 100644 --- a/src/engine/Split.c +++ b/src/engine/Split.c @@ -73,23 +73,27 @@ static QofLogModule log_module = GNC_MOD_ENGINE; enum { PROP_0, - PROP_TX, /* Table */ - PROP_ACCOUNT, /* Table */ - PROP_MEMO, /* Table */ - PROP_ACTION, /* Table */ -// PROP_RECONCILE_STATE, /* Table */ - PROP_RECONCILE_DATE, /* Table */ - PROP_VALUE, /* Table, in 2 fields */ - PROP_SX_ACCOUNT, /* KVP */ - PROP_SX_CREDIT_FORMULA, /* KVP */ - PROP_SX_CREDIT_NUMERIC, /* KVP */ - PROP_SX_DEBIT_FORMULA, /* KVP */ - PROP_SX_DEBIT_NUMERIC, /* KVP */ - PROP_SX_SHARES, /* KVP */ - PROP_LOT, /* KVP */ - PROP_ONLINE_ACCOUNT, /* KVP */ + PROP_TX, /* Table */ + PROP_ACCOUNT, /* Table */ + PROP_MEMO, /* Table */ + PROP_ACTION, /* Table */ +// PROP_RECONCILE_STATE, /* Table */ + PROP_RECONCILE_DATE, /* Table */ + PROP_VALUE, /* Table, in 2 fields */ + PROP_SX_ACCOUNT, /* KVP */ + PROP_SX_CREDIT_FORMULA, /* KVP */ + PROP_SX_CREDIT_NUMERIC, /* KVP */ + PROP_SX_DEBIT_FORMULA, /* KVP */ + PROP_SX_DEBIT_NUMERIC, /* KVP */ + PROP_SX_SHARES, /* KVP */ + PROP_LOT, /* KVP */ + PROP_ONLINE_ACCOUNT, /* KVP */ + PROP_LOT_SPLIT, /* KVP */ + PROP_PEER_GUID, /* KVP */ + PROP_GAINS_SPLIT, /* KVP */ + PROP_GAINS_SOURCE, /* KVP */ PROP_RUNTIME_0, - PROP_AMOUNT, /* Runtime */ + PROP_AMOUNT, /* Runtime */ }; @@ -178,33 +182,49 @@ gnc_split_get_property(GObject *object, g_value_take_object(value, split->lot); break; case PROP_SX_CREDIT_FORMULA: - key = GNC_SX_ID "/" GNC_SX_CREDIT_FORMULA; - qof_instance_get_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_CREDIT_FORMULA; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_SX_CREDIT_NUMERIC: - key = GNC_SX_ID "/" GNC_SX_CREDIT_NUMERIC; - qof_instance_get_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_CREDIT_NUMERIC; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_SX_DEBIT_FORMULA: - key = GNC_SX_ID "/" GNC_SX_DEBIT_FORMULA; - qof_instance_get_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_DEBIT_FORMULA; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_SX_DEBIT_NUMERIC: - key = GNC_SX_ID "/" GNC_SX_DEBIT_NUMERIC; - qof_instance_get_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_DEBIT_NUMERIC; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_SX_ACCOUNT: - key = GNC_SX_ID "/" GNC_SX_ACCOUNT; - qof_instance_get_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_ACCOUNT; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_SX_SHARES: - key = GNC_SX_ID "/" GNC_SX_SHARES; - qof_instance_get_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_SHARES; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_ONLINE_ACCOUNT: - key = "online_id"; - qof_instance_get_kvp (QOF_INSTANCE (split), key, value); - break; + key = "online_id"; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; + case PROP_LOT_SPLIT: + key = "lot-split"; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; + case PROP_PEER_GUID: + key = "peer_guid"; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; + case PROP_GAINS_SPLIT: + key = "gains-split"; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; + case PROP_GAINS_SOURCE: + key = "gains-source"; + qof_instance_get_kvp (QOF_INSTANCE (split), key, value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -225,7 +245,7 @@ gnc_split_set_property(GObject *object, split = GNC_SPLIT(object); if (prop_id < PROP_RUNTIME_0 && split->parent != NULL) - g_assert (qof_instance_get_editlevel(split->parent)); + g_assert (qof_instance_get_editlevel(split->parent)); switch (prop_id) { @@ -256,34 +276,50 @@ gnc_split_set_property(GObject *object, xaccSplitSetLot(split, g_value_get_object(value)); break; case PROP_SX_CREDIT_FORMULA: - key = GNC_SX_ID "/" GNC_SX_CREDIT_FORMULA; - qof_instance_set_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_CREDIT_FORMULA; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_SX_CREDIT_NUMERIC: - key = GNC_SX_ID "/" GNC_SX_CREDIT_NUMERIC; - qof_instance_set_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_CREDIT_NUMERIC; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_SX_DEBIT_FORMULA: - key = GNC_SX_ID "/" GNC_SX_DEBIT_FORMULA; - qof_instance_set_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_DEBIT_FORMULA; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_SX_DEBIT_NUMERIC: - key = GNC_SX_ID "/" GNC_SX_DEBIT_NUMERIC; - qof_instance_set_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_DEBIT_NUMERIC; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_SX_ACCOUNT: - key = GNC_SX_ID "/" GNC_SX_ACCOUNT; - qof_instance_set_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_ACCOUNT; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_SX_SHARES: - key = GNC_SX_ID "/" GNC_SX_SHARES; - qof_instance_set_kvp (QOF_INSTANCE (split), key, value); - break; + key = GNC_SX_ID "/" GNC_SX_SHARES; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; case PROP_ONLINE_ACCOUNT: - key = "online_id"; - qof_instance_set_kvp (QOF_INSTANCE (split), key, value); - break; - default: + key = "online_id"; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; + case PROP_LOT_SPLIT: + key = "lot-split"; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; + case PROP_PEER_GUID: + key = "peer_guid"; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; + case PROP_GAINS_SPLIT: + key = "gains-split"; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; + case PROP_GAINS_SOURCE: + key = "gains-source"; + qof_instance_set_kvp (QOF_INSTANCE (split), key, value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } @@ -386,9 +422,9 @@ gnc_split_class_init(SplitClass* klass) PROP_SX_DEBIT_FORMULA, g_param_spec_string("sx-debit-formula", "Schedule Transaction Debit Formula", - "The formula used to calculate the actual debit " - "amount when a real split is generated from this " - "SX split.", + "The formula used to calculate the actual debit " + "amount when a real split is generated from this " + "SX split.", NULL, G_PARAM_READWRITE)); @@ -398,7 +434,7 @@ gnc_split_class_init(SplitClass* klass) g_param_spec_boxed("sx-debit-numeric", "Scheduled Transaction Debit Numeric", "Numeric value to plug into the Debit Formula when a " - "real split is generated from this SX split.", + "real split is generated from this SX split.", GNC_TYPE_NUMERIC, G_PARAM_READWRITE)); @@ -407,9 +443,9 @@ gnc_split_class_init(SplitClass* klass) PROP_SX_CREDIT_FORMULA, g_param_spec_string("sx-credit-formula", "Schedule Transaction Credit Formula", - "The formula used to calculate the actual credit " - "amount when a real split is generated from this " - "SX split.", + "The formula used to calculate the actual credit " + "amount when a real split is generated from this " + "SX split.", NULL, G_PARAM_READWRITE)); @@ -419,7 +455,7 @@ gnc_split_class_init(SplitClass* klass) g_param_spec_boxed("sx-credit-numeric", "Scheduled Transaction Credit Numeric", "Numeric value to plug into the Credit Formula when a " - "real split is generated from this SX split.", + "real split is generated from this SX split.", GNC_TYPE_NUMERIC, G_PARAM_READWRITE)); /* FIXME: PROP_SX_SHARES should be stored as a gnc_numeric, but the function @@ -433,7 +469,7 @@ gnc_split_class_init(SplitClass* klass) g_param_spec_string("sx-shares", "Scheduled Transaction Shares", "Numeric value of shares to insert in a new split when " - "it's generated from this SX split.", + "it's generated from this SX split.", NULL, G_PARAM_READWRITE)); @@ -452,9 +488,50 @@ gnc_split_class_init(SplitClass* klass) g_param_spec_string ("online-id", "Online Account ID", "The online account which corresponds to this " - "account for OFX/HCBI import", + "account for OFX/HCBI import", NULL, G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_LOT_SPLIT, + g_param_spec_int64 ("lot-split", + "Lot Split", + "Indicates that the split was divided into two " + "splits in order to balance a lot capital gains " + "transaction. Contains a timestamp of the action.", + G_MININT64, G_MAXINT64, 0, + G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_PEER_GUID, + g_param_spec_boxed ("peer-guid", + "Peer GUID", + "The other split in the division.", + GNC_TYPE_GUID, + G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_GAINS_SPLIT, + g_param_spec_boxed ("gains-split", + "Gains Split", + "The capital gains split associated with this " + "split when this split represents the proceeds " + "from the sale of a commodity inside a Lot.", + GNC_TYPE_GUID, + G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_GAINS_SOURCE, + g_param_spec_boxed ("gains-source", + "Gains Source", + "The source split for which this split this is " + "the gains split. ", + GNC_TYPE_GUID, + G_PARAM_READWRITE)); } /********************************************************************\ diff --git a/src/engine/cap-gains.c b/src/engine/cap-gains.c index a313d53d8a..85331449c4 100644 --- a/src/engine/cap-gains.c +++ b/src/engine/cap-gains.c @@ -397,22 +397,18 @@ xaccSplitAssignToLot (Split *split, GNCLot *lot) ts = xaccSplitRetDateReconciledTS (split); xaccSplitSetDateReconciledTS (new_split, &ts); - /* We do not copy the KVP tree, as it seems like a dangerous - * thing to do. If the user wants to access stuff in the 'old' - * kvp tree from the 'new' split, they shoudl follow the - * 'split-lot' pointers. Yes, this is complicated, but what - * else can one do ?? + /* Set the lot-split and peer_guid properties on the two + * splits to indicate that they're linked. */ - /* Add kvp markup to indicate that these two splits used - * to be one before being 'split' - */ - gnc_kvp_bag_add (split->inst.kvp_data, "lot-split", now, - "peer_guid", xaccSplitGetGUID (new_split), - NULL); + qof_instance_set (QOF_INSTANCE (split), + "lot-split", now, + "peer_guid", xaccSplitGetGUID (new_split), + NULL); - gnc_kvp_bag_add (new_split->inst.kvp_data, "lot-split", now, - "peer_guid", xaccSplitGetGUID (split), - NULL); + qof_instance_set (QOF_INSTANCE (new_split), + "lot-split", now, + "peer_guid", xaccSplitGetGUID (split), + NULL); xaccAccountInsertSplit (acc, new_split); xaccTransAppendSplit (trans, new_split); @@ -489,15 +485,14 @@ xaccSplitAssign (Split *split) Split * xaccSplitGetCapGainsSplit (const Split *split) { - KvpValue *val; GncGUID *gains_guid; Split *gains_split; if (!split) return NULL; - val = kvp_frame_get_slot (split->inst.kvp_data, "gains-split"); - if (!val) return NULL; - gains_guid = kvp_value_get_guid (val); + qof_instance_get (QOF_INSTANCE (split), + "gains-split", &gains_guid, + NULL); if (!gains_guid) return NULL; /* Both splits will be in the same collection, so search there. */ @@ -512,15 +507,14 @@ xaccSplitGetCapGainsSplit (const Split *split) Split * xaccSplitGetGainsSourceSplit (const Split *split) { - KvpValue *val; GncGUID *source_guid; Split *source_split; if (!split) return NULL; - val = kvp_frame_get_slot (split->inst.kvp_data, "gains-source"); - if (!val) return NULL; - source_guid = kvp_value_get_guid (val); + qof_instance_get (QOF_INSTANCE (split), + "gains-source", &source_guid, + NULL); if (!source_guid) return NULL; /* Both splits will be in the same collection, so search there. */ @@ -819,14 +813,18 @@ xaccSplitComputeCapGains(Split *split, Account *gain_acc) xaccSplitSetMemo (lot_split, _("Realized Gain/Loss")); xaccSplitSetMemo (gain_split, _("Realized Gain/Loss")); - /* For the new transaction, install KVP markup indicating + /* For the new transaction, set the split properties indicating * that this is the gains transaction that corresponds * to the gains source. */ - kvp_frame_set_guid (split->inst.kvp_data, "gains-split", - xaccSplitGetGUID (lot_split)); - kvp_frame_set_guid (lot_split->inst.kvp_data, "gains-source", - xaccSplitGetGUID (split)); + xaccTransBeginEdit (base_txn); + qof_instance_set (QOF_INSTANCE (split), + "gains-split", xaccSplitGetGUID (lot_split), + NULL); + xaccTransCommitEdit (base_txn); + qof_instance_set (QOF_INSTANCE (lot_split), + "gains-source", xaccSplitGetGUID (split), + NULL); } else @@ -882,7 +880,7 @@ xaccSplitComputeCapGains(Split *split, Account *gain_acc) xaccSplitSetAmount (gain_split, negvalue); xaccSplitSetValue (gain_split, negvalue); - /* Some short-cuts to help avoid the above kvp lookup. */ + /* Some short-cuts to help avoid the above property lookup. */ split->gains = GAINS_STATUS_CLEAN; split->gains_split = lot_split; lot_split->gains = GAINS_STATUS_GAINS;