mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Bug 798681 - Previously imported investment income transactions may not be filtered.
Resequence process_investment_transaction so that the first split is the primary asset account split (cash unless it's a reinvest) followed by the security asset account if it's not income and finally the income split for income or reinvest transactions. Note that there's also a sign change on the income splits for income and reinvest transactions: testing showed the signs to be backwards.
This commit is contained in:
parent
6a9e1cb249
commit
862848380c
@ -804,8 +804,9 @@ add_investment_split(Transaction* transaction, Account* account,
|
|||||||
xaccTransAppendSplit(transaction, split);
|
xaccTransAppendSplit(transaction, split);
|
||||||
xaccAccountInsertSplit(account, split);
|
xaccAccountInsertSplit(account, split);
|
||||||
|
|
||||||
gnc_amount = gnc_ofx_numeric_from_double_txn(ofx_get_investment_amount(data),
|
gnc_amount =
|
||||||
transaction);
|
gnc_ofx_numeric_from_double_txn(ofx_get_investment_amount(data),
|
||||||
|
transaction);
|
||||||
gnc_units = gnc_ofx_numeric_from_double (data->units, commodity);
|
gnc_units = gnc_ofx_numeric_from_double (data->units, commodity);
|
||||||
xaccSplitSetAmount(split, gnc_units);
|
xaccSplitSetAmount(split, gnc_units);
|
||||||
xaccSplitSetValue(split, gnc_amount);
|
xaccSplitSetValue(split, gnc_amount);
|
||||||
@ -854,77 +855,75 @@ add_currency_split(Transaction *transaction, Account* account,
|
|||||||
gnc_import_set_split_online_id (split, sanitize_string (data->fi_id));
|
gnc_import_set_split_online_id (split, sanitize_string (data->fi_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ******** Process an investment transaction **********/
|
||||||
|
/* Note that the ACCT_TYPE_STOCK account type
|
||||||
|
should be replaced with something derived from
|
||||||
|
data->invtranstype*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
process_investment_transaction(Transaction *transaction, Account *import_account,
|
process_investment_transaction(Transaction *transaction, Account *import_account,
|
||||||
OfxTransactionData *data, ofx_info *info)
|
OfxTransactionData *data, ofx_info *info)
|
||||||
{
|
{
|
||||||
Split *split;
|
|
||||||
gnc_numeric gnc_amount, gnc_units;
|
|
||||||
gnc_commodity *investment_commodity = NULL;
|
|
||||||
Account *investment_account = NULL;
|
Account *investment_account = NULL;
|
||||||
Account *income_account = NULL;
|
Account *income_account = NULL;
|
||||||
QofBook *book = qof_instance_get_book(QOF_INSTANCE(transaction));
|
gnc_commodity *investment_commodity;
|
||||||
|
double amount = data->amount;
|
||||||
|
|
||||||
|
g_return_if_fail(data->invtransactiontype_valid);
|
||||||
|
|
||||||
gnc_utf8_strip_invalid (data->unique_id);
|
gnc_utf8_strip_invalid (data->unique_id);
|
||||||
|
|
||||||
/********* Process an investment transaction **********/
|
|
||||||
/* Note that the ACCT_TYPE_STOCK account type
|
|
||||||
should be replaced with something derived from
|
|
||||||
data->invtranstype*/
|
|
||||||
|
|
||||||
// We have an investment transaction. First select the correct commodity.
|
// Set the cash split unless it's a reinvestment, which doesn't have one.
|
||||||
investment_commodity = gnc_import_select_commodity(data->unique_id,
|
if (data->invtransactiontype != OFX_REINVEST)
|
||||||
FALSE,
|
|
||||||
NULL,
|
|
||||||
NULL);
|
|
||||||
if (investment_commodity != NULL)
|
|
||||||
investment_account = choose_investment_account(data, info,
|
|
||||||
investment_commodity);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
PERR("Commodity not found for the investment transaction");
|
DEBUG("Adding investment cash split.");
|
||||||
}
|
|
||||||
|
|
||||||
if (investment_account != NULL &&
|
|
||||||
data->unitprice_valid &&
|
|
||||||
data->units_valid &&
|
|
||||||
( data->invtransactiontype != OFX_INCOME ) )
|
|
||||||
add_investment_split(transaction, investment_account, data);
|
|
||||||
else
|
|
||||||
PERR("The investment account, units or unitprice was not found for the investment transaction");
|
|
||||||
|
|
||||||
if (data->invtransactiontype_valid && investment_account)
|
|
||||||
{
|
|
||||||
double amount = data->amount;
|
|
||||||
#ifdef HAVE_LIBOFX_VERSION_0_10
|
|
||||||
if (data->currency_ratio_valid && data->currency_ratio != 0)
|
|
||||||
amount *= data->currency_ratio;
|
|
||||||
#endif
|
|
||||||
if (data->invtransactiontype == OFX_REINVEST
|
|
||||||
|| data->invtransactiontype == OFX_INCOME)
|
|
||||||
income_account = choose_income_account(investment_account,
|
|
||||||
transaction, data, info);
|
|
||||||
if (income_account != NULL &&
|
|
||||||
data->invtransactiontype == OFX_REINVEST)
|
|
||||||
{
|
|
||||||
DEBUG("Adding investment split; Money flows from the income account");
|
|
||||||
add_currency_split(transaction, income_account, -amount, data);
|
|
||||||
}
|
|
||||||
if (income_account != NULL &&
|
|
||||||
data->invtransactiontype == OFX_INCOME)
|
|
||||||
{
|
|
||||||
DEBUG("Adding investment split; Money flows to the income account");
|
|
||||||
add_currency_split(transaction, income_account, amount, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data->invtransactiontype_valid
|
|
||||||
&& data->invtransactiontype != OFX_REINVEST)
|
|
||||||
{
|
|
||||||
DEBUG("Adding investment split; Money flows from or to the cash account");
|
|
||||||
add_currency_split(transaction, import_account,
|
add_currency_split(transaction, import_account,
|
||||||
-ofx_get_investment_amount(data), data);
|
-ofx_get_investment_amount(data), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
investment_commodity = gnc_import_select_commodity(data->unique_id,
|
||||||
|
FALSE, NULL, NULL);
|
||||||
|
if (!investment_commodity)
|
||||||
|
{
|
||||||
|
PERR("Commodity not found for the investment transaction");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
investment_account = choose_investment_account(data, info,
|
||||||
|
investment_commodity);
|
||||||
|
|
||||||
|
if (!investment_account)
|
||||||
|
{
|
||||||
|
PERR("Failed to determine an investment asset account.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->invtransactiontype != OFX_INCOME)
|
||||||
|
{
|
||||||
|
if (data->unitprice_valid && data->units_valid)
|
||||||
|
add_investment_split(transaction, investment_account, data);
|
||||||
|
else
|
||||||
|
PERR("Unable to add investment split, unit price or units were invalid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(data->invtransactiontype == OFX_REINVEST
|
||||||
|
|| data->invtransactiontype == OFX_INCOME))
|
||||||
|
//Done
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBOFX_VERSION_0_10
|
||||||
|
if (data->currency_ratio_valid && data->currency_ratio != 0)
|
||||||
|
amount *= data->currency_ratio;
|
||||||
|
#endif
|
||||||
|
income_account = choose_income_account(investment_account,
|
||||||
|
transaction, data, info);
|
||||||
|
g_return_if_fail(income_account);
|
||||||
|
|
||||||
|
DEBUG("Adding investment income split.");
|
||||||
|
if (data->invtransactiontype == OFX_REINVEST)
|
||||||
|
add_currency_split(transaction, income_account, amount, data);
|
||||||
|
else
|
||||||
|
add_currency_split(transaction, income_account, -amount, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ofx_proc_transaction_cb(OfxTransactionData data, void *user_data)
|
int ofx_proc_transaction_cb(OfxTransactionData data, void *user_data)
|
||||||
|
Loading…
Reference in New Issue
Block a user