Convert capital gains kvp access to properties on Split.

This commit is contained in:
John Ralls 2014-05-01 12:41:06 -07:00
parent 44ca77766a
commit 6dfb7febf2
2 changed files with 173 additions and 98 deletions

View File

@ -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));
}
/********************************************************************\

View File

@ -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;