asset gain report added (-A)

This commit is contained in:
John Wiegley 2004-06-22 02:05:42 -04:00 committed by johnw
parent 1a1c8cdd2b
commit d022744c18
2 changed files with 55 additions and 12 deletions

26
README
View file

@ -403,7 +403,12 @@ To enable pricing reports, three options are possible:
at time of purchase. Thus, totals in the register and balance at time of purchase. Thus, totals in the register and balance
report reflect the total amount spent. report reflect the total amount spent.
**-Q FILE** :: **-A** ::
Report commodities in terms of their net gain, which is: the market
value minus the cost basis. A balance report using this option
shows very quickly the performance of investments.
**-Q** ::
When needed (see the =-L= option) pricing quotes are obtained by When needed (see the =-L= option) pricing quotes are obtained by
calling the script =getquote= (a sample Perl script is provided, but calling the script =getquote= (a sample Perl script is provided, but
the interface is kept simple so replacements may be made). the interface is kept simple so replacements may be made).
@ -413,8 +418,16 @@ To enable pricing reports, three options are possible:
pricing data is older than MINS minutes. The default is one day, pricing data is older than MINS minutes. The default is one day,
or 1440 minutes. or 1440 minutes.
Note that the =-B=, =-T=, =-V=, and =-P= and =-Q= flags are all **-p ARG** ::
mutually exclusive. Whichever option appears last is used. If a string, such as "COMM=$1.20", the commodity COMM will be
reported only in terms of the conversion factor, which supersedes
all other pricing histories for that commodity. This can be used to
perform arbitrary value substitutions. For example, to report the
value of your dollars in terms of the ounces of gold they would buy,
use: -p "$=0.00280112 AU" (or whatever the current exchange rate
is).
Note that the =-B=, =-T=, =-V=, and =-A= are mutually exclusive.
** Accounts and Inventories ** Accounts and Inventories
@ -1169,7 +1182,12 @@ launches =vi= to let you confirm that the entry looks appropriate.
at time of purchase. Thus, totals in the register and balance at time of purchase. Thus, totals in the register and balance
report reflect the total amount spent. report reflect the total amount spent.
**-Q FILE** :: **-A** ::
Report commodities in terms of their net gain, which is: the market
value minus the cost basis. A balance report using this option
shows very quickly the performance of investments.
**-Q** ::
When needed (see the =-L= option) pricing quotes are obtained by When needed (see the =-L= option) pricing quotes are obtained by
calling the script =getquote= (a sample Perl script is provided, but calling the script =getquote= (a sample Perl script is provided, but
the interface is kept simple so replacements may be made). the interface is kept simple so replacements may be made).

View file

@ -18,9 +18,10 @@ static bool full_names = false;
static bool print_monthly = false; static bool print_monthly = false;
static bool gnuplot_safe = false; static bool gnuplot_safe = false;
static bool cost_basis = false; static bool cost_basis = false;
static bool use_history = false; static bool use_history = false;
static bool get_quotes = false; static bool net_gain = false;
static bool get_quotes = false;
long pricing_leeway = 24 * 3600; long pricing_leeway = 24 * 3600;
std::string price_db; std::string price_db;
@ -88,6 +89,23 @@ static amount * resolve_amount(amount * amt,
else if (cost_basis) { else if (cost_basis) {
value = amt->value(); value = amt->value();
} }
else if (net_gain) {
value = amt->street(when ? when : (have_ending ? &end_date : NULL),
use_history, get_quotes);
amount * basis = amt->value();
if (value->commdty() == basis->commdty()) {
basis->negate();
value->credit(basis);
} else {
// If the commodities do not match, ignore this amount by
// returning a zeroed value.
delete basis;
basis = value->copy();
basis->negate();
value->credit(basis);
delete basis;
}
}
else { else {
value = amt->street(when ? when : (have_ending ? &end_date : NULL), value = amt->street(when ? when : (have_ending ? &end_date : NULL),
use_history, get_quotes); use_history, get_quotes);
@ -992,7 +1010,7 @@ int main(int argc, char * argv[])
int c; int c;
while (-1 != (c = getopt(argc, argv, while (-1 != (c = getopt(argc, argv,
"+Bb:Ccd:Ee:Ff:Ghi:L:l:MN:nP:p:QRSsTUVv"))) { "+ABb:Ccd:Ee:Ff:Ghi:L:l:MN:nP:p:QRSsTUVv"))) {
switch (char(c)) { switch (char(c)) {
case 'b': case 'b':
have_beginning = true; have_beginning = true;
@ -1059,13 +1077,20 @@ int main(int argc, char * argv[])
get_quotes = true; get_quotes = true;
break; break;
case 'B':
cost_basis = true;
// fall through...
case 'V': case 'V':
use_history = true; use_history = true;
break; break;
case 'B':
cost_basis = true;
use_history = true;
break;
case 'A':
net_gain = true;
use_history = true;
break;
case 'T': case 'T':
cost_basis = false; cost_basis = false;
use_history = false; use_history = false;
@ -1147,7 +1172,7 @@ int main(int argc, char * argv[])
} }
} }
if (use_history && ! price_db.empty()) if (use_history && ! cost_basis && ! price_db.empty())
entry_count += parse_ledger_file(main_ledger, price_db, regexps, entry_count += parse_ledger_file(main_ledger, price_db, regexps,
command == "equity"); command == "equity");