mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Convert capital gains kvp access to properties on Split.
This commit is contained in:
parent
44ca77766a
commit
6dfb7febf2
@ -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));
|
||||
}
|
||||
|
||||
/********************************************************************\
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user